Showing preview only (1,217K chars total). Download the full file or copy to clipboard to get everything.
Repository: zhang2657977442/wuyou-frontend
Branch: master
Commit: 4ba119db48ba
Files: 176
Total size: 1.1 MB
Directory structure:
gitextract_1uh0qe7r/
├── .gitignore
├── App.vue
├── AppEntryController.js
├── LICENSE
├── README.md
├── apis/
│ ├── http.js
│ └── index.js
├── common/
│ ├── auth.js
│ ├── cityData.js
│ ├── data.js
│ ├── date.js
│ ├── db.js
│ ├── graceChecker.js
│ ├── modalHelper.js
│ ├── router.js
│ └── utils.js
├── components/
│ ├── GoEasyAudioPlayer/
│ │ └── GoEasyAudioPlayer.vue
│ ├── QS-tabs/
│ │ └── QS-tabs.vue
│ ├── m-ad/
│ │ └── m-ad.vue
│ ├── m-cc-btn/
│ │ └── m-cc-btn.vue
│ ├── m-cc-popup/
│ │ └── m-cc-popup.vue
│ ├── m-cell/
│ │ └── m-cell.vue
│ ├── m-codedialog/
│ │ └── m-codedialog.vue
│ ├── m-company/
│ │ └── m-company.vue
│ ├── m-empty-data/
│ │ └── m-empty-data.vue
│ ├── m-fail/
│ │ └── m-fail.vue
│ ├── m-format-card/
│ │ └── m-format-card.vue
│ ├── m-format-phone/
│ │ └── m-format-phone.vue
│ ├── m-icon/
│ │ ├── m-icon.css
│ │ └── m-icon.vue
│ ├── m-input/
│ │ └── m-input.vue
│ ├── m-page-view/
│ │ └── m-page-view.vue
│ ├── m-popup/
│ │ └── m-popup.vue
│ ├── m-popup-header/
│ │ └── m-popup-header.vue
│ ├── m-position/
│ │ └── m-position.vue
│ ├── m-qrcode/
│ │ ├── m-qrcode.vue
│ │ └── qrcode.js
│ ├── m-swiper/
│ │ └── m-swiper.vue
│ ├── m-textarea/
│ │ └── m-textarea.vue
│ ├── m-upimg/
│ │ ├── m-upimg.1.vue
│ │ └── m-upimg.vue
│ ├── mpvue-citypicker/
│ │ ├── city-data/
│ │ │ ├── area.js
│ │ │ ├── city.js
│ │ │ └── province.js
│ │ └── mpvueCityPicker.vue
│ ├── mpvue-picker/
│ │ └── mpvue-picker.vue
│ ├── sunui-grand/
│ │ └── sunui-grand.vue
│ ├── uni-load-more/
│ │ ├── readme.md
│ │ └── uni-load-more.vue
│ ├── uni-popup1/
│ │ └── uni-popup.vue
│ └── yzb/
│ ├── yzb-about.vue
│ ├── yzb-apply.vue
│ ├── yzb-browse.vue
│ ├── yzb-classification.vue
│ ├── yzb-connected.vue
│ ├── yzb-filterDropdown.vue
│ ├── yzb-grid.vue
│ ├── yzb-notice.vue
│ └── yzb-resume.vue
├── config/
│ ├── assets.config.js
│ ├── constData.config.js
│ ├── formRule.config.js
│ ├── index.config.js
│ └── routes.config.js
├── lib/
│ ├── EmojiDecoder.js
│ ├── imservice.js
│ └── restapi.js
├── main.js
├── manifest.json
├── pages/
│ ├── chat/
│ │ ├── chat.vue
│ │ ├── notice/
│ │ │ ├── noticeDetail.vue
│ │ │ └── notices.vue
│ │ └── privateChat.vue
│ ├── common/
│ │ ├── industry.vue
│ │ └── post.vue
│ ├── company/
│ │ ├── detail.vue
│ │ ├── list.vue
│ │ └── resumeList.vue
│ ├── login/
│ │ ├── bindphone.vue
│ │ ├── index.vue
│ │ ├── login.vue
│ │ ├── reg.vue
│ │ └── success.vue
│ ├── main/
│ │ ├── main.vue
│ │ └── search.vue
│ ├── position/
│ │ ├── detail.vue
│ │ └── list.vue
│ ├── type/
│ │ └── type.vue
│ └── user/
│ ├── aboutUs.vue
│ ├── apply.vue
│ ├── browse.vue
│ ├── collect.vue
│ ├── company/
│ │ ├── auth.vue
│ │ ├── company.vue
│ │ ├── enter.vue
│ │ ├── position-edit.vue
│ │ └── positions.vue
│ ├── connected.vue
│ ├── contactUs.vue
│ ├── help.vue
│ ├── helpcenterDetails.vue
│ ├── hideSetting.vue
│ ├── person/
│ │ ├── edit-edu.vue
│ │ ├── edit-expect.vue
│ │ ├── edit-pro-content.vue
│ │ ├── edit-pro.vue
│ │ ├── edit-skill.vue
│ │ ├── edit-work-content.vue
│ │ ├── edit-work.vue
│ │ ├── resume.vue
│ │ └── resumeDetail.vue
│ ├── privacy.vue
│ ├── promoCode.vue
│ ├── robot.vue
│ ├── settings.vue
│ ├── terms.vue
│ ├── user.vue
│ └── userInfo.vue
├── pages.json
├── static/
│ ├── css/
│ │ ├── chatInterface.css
│ │ ├── common.css
│ │ └── yzb-icon.css
│ └── icomoon/
│ ├── selection.json
│ └── style.css
├── store/
│ └── index.js
├── uni.scss
└── uni_modules/
├── bctos-rich-text/
│ ├── changelog.md
│ ├── components/
│ │ └── bctos-rich-text/
│ │ └── bctos-rich-text.vue
│ ├── package.json
│ └── readme.md
├── uni-collapse/
│ ├── changelog.md
│ ├── components/
│ │ ├── uni-collapse/
│ │ │ └── uni-collapse.vue
│ │ └── uni-collapse-item/
│ │ └── uni-collapse-item.vue
│ ├── package.json
│ └── readme.md
├── uni-grid/
│ ├── changelog.md
│ ├── components/
│ │ ├── uni-grid/
│ │ │ └── uni-grid.vue
│ │ └── uni-grid-item/
│ │ └── uni-grid-item.vue
│ ├── package.json
│ └── readme.md
├── uni-icons/
│ ├── changelog.md
│ ├── components/
│ │ └── uni-icons/
│ │ ├── icons.js
│ │ └── uni-icons.vue
│ ├── package.json
│ └── readme.md
├── uni-list/
│ ├── changelog.md
│ ├── components/
│ │ ├── uni-list/
│ │ │ ├── uni-list - ╕▒▒╛.vue
│ │ │ ├── uni-list.vue
│ │ │ ├── uni-refresh.vue
│ │ │ └── uni-refresh.wxs
│ │ ├── uni-list-ad/
│ │ │ └── uni-list-ad.vue
│ │ ├── uni-list-chat/
│ │ │ ├── uni-list-chat.scss
│ │ │ └── uni-list-chat.vue
│ │ └── uni-list-item/
│ │ └── uni-list-item.vue
│ ├── package.json
│ └── readme.md
├── uni-popup/
│ ├── changelog.md
│ ├── components/
│ │ ├── uni-popup/
│ │ │ ├── keypress.js
│ │ │ ├── message.js
│ │ │ ├── popup.js
│ │ │ ├── share.js
│ │ │ └── uni-popup.vue
│ │ ├── uni-popup-dialog/
│ │ │ ├── keypress.js
│ │ │ └── uni-popup-dialog.vue
│ │ ├── uni-popup-message/
│ │ │ └── uni-popup-message.vue
│ │ └── uni-popup-share/
│ │ └── uni-popup-share.vue
│ ├── package.json
│ └── readme.md
├── uni-section/
│ ├── changelog.md
│ ├── components/
│ │ └── uni-section/
│ │ └── uni-section.vue
│ ├── package.json
│ └── readme.md
└── uni-transition/
├── changelog.md
├── components/
│ └── uni-transition/
│ └── uni-transition.vue
├── package.json
└── readme.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
.hbuilderx
.DS_Store
node_modules
/dist
/unpackage
================================================
FILE: App.vue
================================================
<script>
export default {
onLaunch: function(o) {
console.log('App Launch', o);
this.$AppEntryController.getWeChatOpenId();
// #ifdef H5
this.$AppEntryController.handleH5BrowserAddressBarAuth();
// #endif
},
onShow: function(o) {
console.log('App Show', o);
},
onHide: function() {
console.log('App Hide');
}
}
</script>
<style lang="scss">
@import "./static/css/yzb-icon.css";
/*通用 */
view {
// display: flex;
font-size: $uni-font-size-base;
line-height: 1.8;
}
progress,
checkbox-group {
width: 100%;
}
form {
width: 100%;
}
/**
* 全局输入框文本大小
*/
input {
font-size: $uni-font-size-lg;
}
/**
* 全局文本大小
*/
text {
font-size: $uni-font-size-base;
}
/**
* 内容区域
*/
.content {
flex: 1;
width: 100%;
height: 100%;
flex-direction: column;
align-items: center;
}
/**
* 横向布局
*/
.row {
display: flex;
flex-direction: row;
}
/**
* 竖向布局
*/
.column {
display: flex;
flex-direction: column;
}
/**
* 居中对齐
*/
.center-algin{
display: flex;
justify-content: center;
align-items: center;
}
.align-height{
align-items: center;
}
.align-width{
justify-content: center;
}
.align-top{
align-items:flex-start;
}
.align-bottom{
align-items: flex-end;
}
/**
* 左右对齐
*/
.space-between-algin{
width: 100%;
justify-content: space-between;
align-items: center;
}
/* 文本溢出隐藏 */
.text-ellipsis {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
/* 背景色 */
.bg-white{
background: #FFFFFF;
}
.text-color{
color: $uni-text-color;
}
.text-color-inverse{
color: $uni-text-color-inverse;
}
.text-color-grey{
color: $uni-text-color-grey;
}
.text-color-placeholder{
color: $uni-text-color-placeholder;
}
.text-color-disable{
color: $uni-text-color-disable;
}
.text-size-base{
font-size: $uni-font-size-base;
}
.text-size-lg{
font-size: $uni-font-size-lg;
}
.text-size-40{
font-size: $font-size-40;
}
/**
* 字体加粗
*/
.font-bold{
font-weight: bold;
}
/**
* 1行显示,多与的后面省略号显示
*/
.ellipsis-oneline{
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
}
/**
* 两行显示,多与的后面省略号显示
*/
.ellipsis-twoline{
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.bottom-line{
border-bottom: $border-color-base solid 1upx;
}
.left-line{
border-left:$border-color-base solid 1upx;
}
.right-line{
border-right: $border-color-base solid 1upx;
}
.top-line{
border-top: $border-color-base solid 1upx;
}
.width-100{
width: 100%;
}
.height-100{
height: 100%;
}
.padding-5{
padding: 5upx;
}
.padding-10{
padding: 10upx;
}
.padding-15{
padding: 15upx;
}
.padding-20{
padding: 20upx;
}
.padding-height-5{
padding: 5upx 0;
}
.padding-height-10{
padding: 10upx 0;
}
.padding-height-15{
padding: 15upx 0;
}
.padding-height-20{
padding: 20upx 0;
}
.padding-height-25{
padding: 25upx 0;
}
.padding-height-30{
padding: 30upx 0;
}
.padding-height-40{
padding: 40upx 0;
}
.padding-width-5{
padding:0 5upx;
}
.padding-width-10{
padding:0 10upx;
}
.padding-width-15{
padding: 0 15upx;
}
.padding-width-20{
padding:0 20upx;
}
.margin-5{
margin: 5upx;
}
.margin-10{
margin: 10upx;
}
.margin-15{
margin: 15upx;
}
.margin-20{
margin: 20upx;
}
.margin-left-5{
margin-left: 5upx;
}
.margin-left-10{
margin-left: 10upx;
}
.margin-left-15{
margin-left: 15upx;
}
.margin-left-20{
margin-left: 20upx;
}
.margin-right-5{
margin-right: 5upx;
}
.margin-right-10{
margin-right: 10upx;
}
.margin-right-15{
margin-right: 15upx;
}
.margin-right-20{
margin-right: 20upx;
}
.margin-top-5{
margin-top: 5upx;
}
.margin-top-10{
margin-top: 10upx;
}
.margin-top-15{
margin-top: 15upx;
}
.margin-top-20{
margin-top: 20upx;
}
.margin-bottom-5{
margin-bottom: 5upx;
}
.margin-bottom-10{
margin-bottom: 10upx;
}
.margin-bottom-15{
margin-bottom: 15upx;
}
.margin-bottom-20{
margin-bottom: 20upx;
}
.margin-height-5{
margin: 5upx 0;
}
.margin-height-10{
margin: 10upx 0;
}
.margin-height-15{
margin: 15upx 0;
}
.margin-height-20{
margin: 20upx 0;
}
.margin-width-5{
margin:0 5upx;
}
.margin-width-10{
margin:0 10upx;
}
.margin-width-15{
margin: 0 15upx;
}
.margin-width-20{
margin:0 20upx;
}
</style>
================================================
FILE: AppEntryController.js
================================================
import Vue from "vue"
/*
* APP入口页面控制器
* 中心思想:动态入口解决方案 描述见:http://ask.dcloud.net.cn/question/63270
*/
class AppEntryController extends Vue {
constructor(arg) {
super();
}
// 在应用的首页调用main方法 控制路由入口
async main(query) {
return new Promise((resolve, reject) => {
// H5环境保存openId
// #ifdef H5
// H5环境推广码注册
if (query.referrer && query.referrer != " ") {
this.$mRouter.reLaunch({
route: this.$mRoutesConfig.reg,
query: query
})
reject("不可以加载首页数据");
return;
}
// #endif
// 读取配置文件 判断APP是否开启了游客模式 如果开启了无需判断是否登录逻辑
if (this.$mConfig.touristMode && (typeof this.$mConfig.touristMode === "boolean")) {
// #ifdef APP-PLUS
console.log("关闭启动页")
plus.navigator.closeSplashscreen()
// #endif
resolve("可以加载首页数据");
return;
}
// 若APP没有开启游客模式 则检测是否登录? 去登录...
if (!this.$store.getters.hasLogin) {
this.$mRouter.redirectTo({
route: this.$mRoutesConfig.login,
query: query
})
// #ifdef APP-PLUS
setTimeout(() => {
console.log("关闭启动页")
plus.navigator.closeSplashscreen()
}, 800)
// #endif
reject("APP当前不是游客模式,请先登录后进入");
}
})
}
// 小程序端获取openId
getWeChatOpenId() {
// #ifdef H5
let url = window.location.href;
let query = this.$mUtils.getRequestParameters(url);
if (query.openId) this.$store.commit("SET_OPENID", query.openId);
// #endif
// #ifdef MP-WEIXIN | APP-PLUS
// 登录微信小程序 获取openID
this.$store.commit("SET_OPENID", this.$mConfig.testOpenId);
// #endif
}
// 处理H5端 直接通过地址栏访问地址的情况 需要鉴权
handleH5BrowserAddressBarAuth() {
// #ifdef H5
let hashPath = window.location.hash.substr(1);
hashPath = hashPath.split("?")[0];
if (!/\/pages\//.test(hashPath)) return;
for (let routeKey in this.$mRoutesConfig) {
let route = this.$mRoutesConfig[routeKey];
// 如果当前访问的路由是权限页面,判断登录状态
if (route.path == hashPath) {
if (route.requiresAuth && !this.$store.getters.hasLogin) {
console.log("没有登录,无权进入")
this.$mRouter.redirectTo({
route: this.$mRoutesConfig.login,
query: {
}
})
}
break;
}
}
// #endif
}
/*
* 用途:商户状态拦截器
* 说明:当store中的商户状态为 审核中 || 审核失败 的情况 拦截器会向服务器发送请求查询最新的商户状态。
* 场景:点击某一个功能按钮时需要校验商户状态,只有审核成功的商户方可进入,否则跳转到状态提示页面。
*/
async customerStatusInterceptor() {
return new Promise(async (resolve, reject) => {
// store中的状态
let $storeCustomerStatus = this.$store.state.customerInfo.status;
if ($storeCustomerStatus == "SUCCESS") {
// 商户状态:审核通过
resolve($storeCustomerStatus);
return;
}
// 服务器中的状态
try {
let serverCustomerStatus = await this.$apis.getCustomerStatus();
resolve(serverCustomerStatus);
} catch (e) {
reject(e)
}
})
}
/*
* 登录状态下 全局路由获取商户信息
* 说明:APP打开后向服务器拉取最新商户信息,以及商户审核状态,保存在本地store中使用。
* 场景:H5端 每个页面打开后执行 APP或小程序打开后执行
*/
/* async getCustomerInfo() {
if (!this.$store.getters.hasLogin) return;
let customerInfo = await this.$apis.getCustomer();
this.$store.commit("SET_CUSTOMERINFO", customerInfo);
} */
}
export default new AppEntryController()
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2018 DCloud
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# 招聘小程序无忧直聘(前端)
:star:一款基于[uni-app](https://zh.uniapp.dcloud.io/)编写的招聘求职类前端,该前端包含了大部分核心页面和逻辑交互。前端分了两种角色:求职者和招聘者,通过角色切换可以进行页面和功能的切换。建议使用[Hbuilder X](https://hx.dcloud.net.cn/)打开,适合学习\二次开发等用途。
## [快速开始](https://www.wuyoujobs.com/)
## 项目列表
+ [项目官网](https://www.wuyoujobs.com/)
+ 无忧直聘前端(Uni-app+Vue2)
+ 无忧直聘后端(Java+SpringBoot2+MybatisPlus+Mysql)
+ 无忧直聘管理端(React+Ant Design+Ant Design Pro)
## 功能模块
+ 职位发布
+ 简历创建
+ 公司创建
+ 即时通讯(利用[GoEasy](https://www.goeasy.io/cn/websocket.html)实现)
+ 地理位置(利用[腾讯位置服务](https://lbs.qq.com/)实现)
+ 角色切换
+ 收藏岗位
+ 收藏简历
+ 信息搜索
+ 系统通知
+ 谁看过我
## 项目截图

## 运行步骤
+ 启动无忧直聘后端服务
+ 修改manifest.json文件中的AppID

+ 修改main.js文件中的GoEasy配置

+ 修改pages/position/detail.vue文件中的腾讯位置服务配置

如有问题请联系
+ QQ:2657977449
+ 微信:zhang2657977449
<img src="https://github.com/zhang2657977442/MyPicGo/blob/master/other/qq.jpg?raw=true" alt="" width="30%"><img src="https://github.com/zhang2657977442/MyPicGo/blob/master/other/wechat.jpg?raw=true" alt="" width="30%">
================================================
FILE: apis/http.js
================================================
import store from "@/store"
function HTTP(obj, config) {
let defaultConfig = {
isRes: false,
loading: false
}
config = { ...defaultConfig,
...config
}
// 如果需要显示loading,mask防止点击穿透
config.loading && uni.showLoading({
title: '加载中',
mask: true
});
return new Promise((resolve, reject) => {
let options = {
url: "",
method: "GET",
data: {},
dataType: "json",
header: {
"content-type": "application/json",
"X-requested-With": "XMLHttpRequest"
},
success: (res) => {
// console.log("HTTP请求结果:",res)
uni.hideLoading();
// 状态码为0
if (res.statusCode == 200) {
let data = res.data;
//自动校验用户是否登录过期
if (data.code == "40100") {
store.dispatch("reLogin");
return;
}
//返回 { code:10000,msg:"消息",data:[] }
if (config.isRes) {
resolve(data)
}
// 返回 data:[]
else {
if (data.code === 0) {
resolve(data.data)
} else {
wx.showToast({
title: data.message,
icon: "none",
duration: 2000
})
reject(data.msg);
}
}
}
else {
reject("HTTP:状态码异常!");
}
},
fail: (err) => {
uni.hideLoading();
uni.showToast({
title: "网络异常,请稍后再试!",
icon: "none",
})
reject("网络异常,请稍后再试!");
},
complete: () => {}
}
options = { ...options,
...obj
};
const OPENID = uni.getStorageSync("openId");
const Token=uni.getStorageSync("token");
// console.log("Token==="+Token);
if (OPENID) options["header"]["openId"] = OPENID;
if (Token) options["header"]["token"] = Token;
if (options.url && options.method) {
wx.request(options);
} else {
wx.showToast({
title: 'HTTP:缺失参数',
icon: "none",
duration: 2000
})
}
})
}
export default {
GET(url, data = {}, config) {
return HTTP({
url,
data,
method: "GET"
}, config);
},
POST(url, data = {}, config) {
return HTTP({
url,
data,
method: "POST"
}, config);
},
DELETE(url, data = {}, config) {
return HTTP({
url,
data,
method: "DELETE"
}, config);
},
POSTformdata(url, data = {}, config) {
return HTTP({
url,
data,
method: "POST"
}, config);
}
}
================================================
FILE: apis/index.js
================================================
import http from "./http.js";
import config from "@/config/index.config.js";
// 获取OpenId
export const getOpenId = (data) => http.GET(`${config.baseUrl}/user/getOpenId`, data);
// 绑定手机号
export const bindPhoneForWx = (data) => http.GET(`${config.baseUrl}/user/bindPhoneForWx`, data);
// 小程序授权登录
export const xcxUserLogin = (data) => http.POST(`${config.baseUrl}/user/wxUserLogin`, data);
// 获取用户资料
export const getUserInfo = (data) => http.GET(`${config.baseUrl}/user/getUserInfo`, data);
// 用户角色切换
export const switchRole = (data) => http.POST(`${config.baseUrl}/user/switchRole`, data);
// 新增简历信息
export const addResume = (data) => http.POST(`${config.baseUrl}/resume/addResume`, data);
// 查询简历信息
export const getResumeInfo = (id) => http.GET(`${config.baseUrl}/resume/getResumeInfo/${id}`);
// 查询用户简历
export const getUserResume = (data) => http.GET(`${config.baseUrl}/resume/getUserResume`, data);
// 更新简历信息
export const updateResume = (data) => http.POST(`${config.baseUrl}/resume/updateResumeInfo`, data);
// 获取简历列表
export const getResumeList = (data) => http.POST(`${config.baseUrl}/resume/getResumeList`, data);
// 查询工作列表
export const getJobList = (data) => http.POST(`${config.baseUrl}/job/getJobList`, data);
// 新增工作信息
export const addJob = (data) => http.POST(`${config.baseUrl}/job/addJob`, data);
// 更新工作信息
export const updateJobInfo = (data) => http.POST(`${config.baseUrl}/job/updateJobInfo`, data);
// 删除工作信息
export const deleteJob = (id) => http.DELETE(`${config.baseUrl}/job/deleteJob/${id}`);
// 查询行业列表
export const getIndustryList = (data) => http.POST(`${config.baseUrl}/industry/getIndustryList`, data);
// 查询职位列表
export const getPositionList = (data) => http.POST(`${config.baseUrl}/position/getPositionList`, data);
// 查询福利列表
export const getWelfareList = (data) => http.POST(`${config.baseUrl}/welfare/getWelfareList`, data);
// 新增公司信息
export const addCompany = (data) => http.POST(`${config.baseUrl}/company/addCompany`, data);
// 查询公司职位列表
export const getCompanyJob = (data) => http.POST(`${config.baseUrl}/company/getCompanyJob`, data);
// 查询公司列表
export const getCompanyList = (data) => http.POST(`${config.baseUrl}/company/getCompanyList`, data);
// 查询公司信息
export const getCompanyInfo = (id) => http.GET(`${config.baseUrl}/company/getCompanyInfo/${id}`);
// 更新公司信息
export const updateCompanyInfo = (data) => http.POST(`${config.baseUrl}/company/updateCompanyInfo`, data);
// 新增/更新职位信息
export const updatePosition = (data) => http.POST(`${config.baseUrl}/company/updatePosition`, data);
// 查询职位信息
export const getPositionDetail = (data) => http.GET(`${config.baseUrl}/company/getPositionDetail`, data);
// 删除公司职位
export const deletePositionById = (data) => http.GET(`${config.baseUrl}/company/deletePositionById`, data);
// 新增收藏信息
export const addCollect = (data) => http.POST(`${config.baseUrl}/collect/addCollect`, data);
// 删除收藏信息
export const deleteCollect = (data) => http.POST(`${config.baseUrl}/collect/deleteCollect`, data);
// 获取收藏信息
export const getCollectList = (data) => http.POST(`${config.baseUrl}/collect/getCollectList`, data);
// 是否收藏
export const isCollect = (data) => http.POST(`${config.baseUrl}/collect/isCollect`, data);
// 新增应聘信息
export const addApply = (data) => http.POST(`${config.baseUrl}/apply/addApply`, data);
// 删除收藏信息
export const deleteApply = (data) => http.POST(`${config.baseUrl}/apply/deleteApply`, data);
// 获取应聘信息
export const getApplyList = (data) => http.POST(`${config.baseUrl}/apply/getApplyList`, data);
// 是否应聘
export const isApply = (data) => http.POST(`${config.baseUrl}/apply/isApply`, data);
// 新增浏览信息
export const addBrowse = (data) => http.POST(`${config.baseUrl}/browse/addBrowse`, data);
// 获取浏览信息
export const getBrowseList = (data) => http.POST(`${config.baseUrl}/browse/getBrowseList`, data);
// 查询期望职位列表
export const getJobExpectList = (data) => http.GET(`${config.baseUrl}/person/getJobExpectList`, data);
// 查询期望职位详情
export const getJobExpectDetail = (data) => http.GET(`${config.baseUrl}/person/getJobExpectDetail`, data);
// 新增/更新期望职位
export const updateJobExpect = (data) => http.POST(`${config.baseUrl}/person/updateJobExpect`, data);
// 删除期望职位
export const deleteJobExpectById = (data) => http.GET(`${config.baseUrl}/person/deleteJobExpectById`, data);
// 查询工作经历列表
export const getWorkExpList = (data) => http.GET(`${config.baseUrl}/person/getWorkExpList`, data);
// 查询工作经历详情
export const getWorkExpDetail = (data) => http.GET(`${config.baseUrl}/person/getWorkExpDetail`, data);
// 新增/更新工作经历
export const updateWorkExp = (data) => http.POST(`${config.baseUrl}/person/updateWorkExp`, data);
// 删除工作经历
export const deleteWorkExpById = (data) => http.GET(`${config.baseUrl}/person/deleteWorkExpById`, data);
// 查询项目经历列表
export const getProExpList = (data) => http.GET(`${config.baseUrl}/person/getProExpList`, data);
// 查询项目经历详情
export const getProExpDetail = (data) => http.GET(`${config.baseUrl}/person/getProExpDetail`, data);
// 新增/更新项目经历
export const updateProExp = (data) => http.POST(`${config.baseUrl}/person/updateProExp`, data);
// 删除项目经历
export const deleteProExpById = (data) => http.GET(`${config.baseUrl}/person/deleteProExpById`, data);
// 查询教育经历列表
export const getEduExpList = (data) => http.GET(`${config.baseUrl}/person/getEduExpList`, data);
// 查询教育经历详情
export const getEduExpDetail = (data) => http.GET(`${config.baseUrl}/person/getEduExpDetail`, data);
// 新增/更新教育经历
export const updateEduExp = (data) => http.POST(`${config.baseUrl}/person/updateEduExp`, data);
// 删除教育经历
export const deleteEduExpById = (data) => http.GET(`${config.baseUrl}/person/deleteEduExpById`, data);
// 用户登录
export const postLogin = (data) => http.POST(`${config.baseUrl}/ums/xcxUserLogin`, data);
// 获取短信验证码
export const getMsgCode = (data) => http.GET(`${config.baseUrl}/register/sendMsg`, data);
// 校验注册验证码
export const postRegCode = (data) => http.POST(`${config.baseUrl}/register/verifySMSCode`, data);
// 获取卡片信息
export const getCardBin = (data) => http.GET(`${config.baseUrl}/card/getCardBin`, data);
// 图片上传
export const upload = (data) => http.POST(`${config.baseUrl}/register/upImg`, data);
// 图片下载
export const downloadImg = (data) => http.GET(`${config.baseUrl}/my/downloadImg`, data);
// 查询公告列表
export const getCmsList = (data) => http.POST(`${config.baseUrl}/cms/getCmsList`, data);
================================================
FILE: common/auth.js
================================================
function loginCheck(pageObj) {
if (pageObj.onLoad) {
let _onLoad = pageObj.onLoad;
// 使用onLoad的话需要传递options
pageObj.onLoad = function(options) {
if (true) {
// 获取当前页面
_onLoad.call(this, options);
} else {
//跳转到登录页
wx.redirectTo({
url: "/pages/login/login"
});
}
}
}
return pageObj;
}
export default loginCheck;
================================================
FILE: common/cityData.js
================================================
export default [{
"label": "福建省",
"value": "3900",
"children": [{
"label": "三明市",
"value": "3950"
}, {
"label": "南平市",
"value": "4010"
}, {
"label": "厦门市",
"value": "3930"
}, {
"label": "宁德市",
"value": "4030"
}, {
"label": "泉州市",
"value": "3970"
}, {
"label": "漳州市",
"value": "3990"
}, {
"label": "福州市",
"value": "3910"
}, {
"label": "莆田市",
"value": "3940"
}, {
"label": "龙岩市",
"value": "4050"
}],
}, {
"label": "西藏自治区",
"value": "",
"children": [{
"label": "山南地区",
"value": "7740"
}, {
"label": "拉萨市",
"value": "7710"
}, {
"label": "日喀则地区",
"value": "7760"
}, {
"label": "昌都地区",
"value": "7720"
}, {
"label": "林芝地区",
"value": "7830"
}, {
"label": "那曲地区",
"value": "7790"
}, {
"label": "阿里地区",
"value": "7810"
}],
}, {
"label": "贵州省",
"value": "",
"children": [{
"label": "六盘水市",
"value": "7020"
}, {
"label": "安顺市",
"value": "7110"
}, {
"label": "毕节市",
"value": "7090"
}, {
"label": "贵阳市",
"value": "7010"
}, {
"label": "遵义市",
"value": "7030"
}, {
"label": "铜仁市",
"value": "7050"
}, {
"label": "黔东南苗族",
"value": "7130"
}, {
"label": "黔南布依族",
"value": "7150"
}, {
"label": "黔西南布依族苗族自治州",
"value": "7070"
}],
}, {
"label": "上海市",
"value": "2900",
"children": [{
"label": "上海市",
"value": "2900"
}],
}, {
"label": "广东省",
"value": "5800",
"children": [{
"label": "东莞市",
"value": "6020"
}, {
"label": "中山市",
"value": "6030"
}, {
"label": "云浮市",
"value": "6060"
}, {
"label": "佛山市",
"value": "5880"
}, {
"label": "广州市",
"value": "5810"
}, {
"label": "惠州市",
"value": "5950"
}, {
"label": "揭阳市",
"value": "6050"
}, {
"label": "梅州市",
"value": "5960"
}, {
"label": "汕头市",
"value": "5860"
}, {
"label": "汕尾市",
"value": "5970"
}, {
"label": "江门市",
"value": "5890"
}, {
"label": "河源市",
"value": "5980"
}, {
"label": "深圳市",
"value": "5840"
}, {
"label": "清远市",
"value": "6010"
}, {
"label": "湛江市",
"value": "5910"
}, {
"label": "潮州市",
"value": "6040"
}, {
"label": "珠海市",
"value": "5850"
}, {
"label": "肇庆市",
"value": "5930"
}, {
"label": "茂名市",
"value": "5920"
}, {
"label": "阳江市",
"value": "5990"
}, {
"label": "韶关市",
"value": "5820"
}],
}, {
"label": "湖北省",
"value": "3900",
"children": [{
"label": "十堰市",
"value": "5230"
}, {
"label": "咸宁市",
"value": "5360"
}, {
"label": "孝感市",
"value": "5350"
}, {
"label": "宜昌市",
"value": "5250"
}, {
"label": "恩施土家族苗族自治州",
"value": "5410"
}, {
"label": "武汉市",
"value": "5210"
}, {
"label": "荆州市",
"value": "5370"
}, {
"label": "荆门市",
"value": "5320"
}, {
"label": "襄阳市",
"value": "5280"
}, {
"label": "鄂州市",
"value": "5310"
}, {
"label": "随州市",
"value": "5270"
}, {
"label": "黄冈市",
"value": "5330"
}, {
"label": "黄石市",
"value": "5220"
}],
}, {
"label": "湖南省",
"value": "",
"children": [{
"label": "娄底市",
"value": "5620"
}, {
"label": "岳阳市",
"value": "5570"
}, {
"label": "常德市",
"value": "5580"
}, {
"label": "张家界市",
"value": "5590"
}, {
"label": "怀化市",
"value": "5670"
}, {
"label": "株洲市",
"value": "5520"
}, {
"label": "永州市",
"value": "5650"
}, {
"label": "湘潭市",
"value": "5530"
}, {
"label": "湘西州",
"value": "5690"
}, {
"label": "益阳市",
"value": "5610"
}, {
"label": "衡阳市",
"value": "5540"
}, {
"label": "邵阳市",
"value": "5550"
}, {
"label": "郴州市",
"value": "5630"
}, {
"label": "长沙市",
"value": "5510"
}],
}, {
"label": "四川省",
"value": "6500",
"children": [{
"label": "乐山市",
"value": "6650"
}, {
"label": "内江市",
"value": "6630"
}, {
"label": "凉山彝族州",
"value": "6840"
}, {
"label": "南充市",
"value": "6730"
}, {
"label": "宜宾市",
"value": "6710"
}, {
"label": "巴中市",
"value": "6870"
}, {
"label": "广元市",
"value": "6610"
}, {
"label": "广安市",
"value": "6690"
}, {
"label": "德阳市",
"value": "6580"
}, {
"label": "成都市",
"value": "6510"
}, {
"label": "攀枝花市",
"value": "6560"
}, {
"label": "泸州市",
"value": "6570"
}, {
"label": "甘孜藏族州",
"value": "6810"
}, {
"label": "眉山市",
"value": "6670"
}, {
"label": "绵阳市",
"value": "6590"
}, {
"label": "自贡市",
"value": "6550"
}, {
"label": "资阳市",
"value": "6880"
}, {
"label": "达州市",
"value": "6750"
}, {
"label": "遂宁市",
"value": "6620"
}, {
"label": "阿坝藏族羌族州",
"value": "6790"
}, {
"label": "雅安市",
"value": "6770"
}],
}, {
"label": "安徽省",
"value": "3600",
"children": [{
"label": "亳州市",
"value": "3810"
}, {
"label": "六安市",
"value": "3760"
}, {
"label": "合肥市",
"value": "3610"
}, {
"label": "安庆市",
"value": "3680"
}, {
"label": "宣城市",
"value": "3770"
}, {
"label": "宿州市",
"value": "3740"
}, {
"label": "池州市",
"value": "3790"
}, {
"label": "淮北市",
"value": "3660"
}, {
"label": "淮南市",
"value": "3640"
}, {
"label": "滁州市",
"value": "3750"
}, {
"label": "芜湖市",
"value": "3620"
}, {
"label": "蚌埠市",
"value": "3630"
}, {
"label": "铜陵市",
"value": "3670"
}, {
"label": "阜阳市",
"value": "3720"
}, {
"label": "马鞍山市",
"value": "3650"
}, {
"label": "黄山市",
"value": "3710"
}],
}, {
"label": "广西省",
"value": "6100",
"children": [{
"label": "广西省",
"value": "6100"
}],
}, {
"label": "江苏省",
"value": "3000",
"children": [{
"label": "南京市",
"value": "3010"
}, {
"label": "南通市",
"value": "3060"
}, {
"label": "宿迁市",
"value": "3180"
}, {
"label": "常州市",
"value": "3040"
}, {
"label": "徐州市",
"value": "3030"
}, {
"label": "扬州市",
"value": "3120"
}, {
"label": "无锡市",
"value": "3020"
}, {
"label": "泰州市",
"value": "3160"
}, {
"label": "淮安市",
"value": "3080"
}, {
"label": "盐城市",
"value": "3110"
}, {
"label": "苏州市",
"value": "3050"
}, {
"label": "连云港市",
"value": "3070"
}, {
"label": "镇江市",
"value": "3140"
}],
}, {
"label": "吉林省",
"value": "",
"children": [{
"label": "吉林市",
"value": "2420"
}, {
"label": "四平市",
"value": "2430"
}, {
"label": "延边朝鲜族",
"value": "2490"
}, {
"label": "松原市",
"value": "2510"
}, {
"label": "白城市",
"value": "2470"
}, {
"label": "白山市",
"value": "2460"
}, {
"label": "辽源市",
"value": "2440"
}, {
"label": "通化市",
"value": "2450"
}, {
"label": "长春市",
"value": "2410"
}],
}, {
"label": "河南省",
"value": "4900",
"children": [{
"label": "三门峡市",
"value": "5050"
}, {
"label": "信阳市",
"value": "5150"
}, {
"label": "南阳市",
"value": "5130"
}, {
"label": "周口市",
"value": "5080"
}, {
"label": "商丘市",
"value": "5060"
}, {
"label": "安阳市",
"value": "4960"
}, {
"label": "平顶山市",
"value": "4950"
}, {
"label": "开封市",
"value": "4920"
}, {
"label": "新乡市",
"value": "4980"
}, {
"label": "洛阳市",
"value": "4930"
}, {
"label": "漯河市",
"value": "5040"
}, {
"label": "濮阳市",
"value": "5020"
}, {
"label": "焦作市",
"value": "5010"
}, {
"label": "许昌市",
"value": "5030"
}, {
"label": "郑州市",
"value": "4910"
}, {
"label": "驻马店市",
"value": "5110"
}, {
"label": "鹤壁市",
"value": "4970"
}],
}, {
"label": "河北省",
"value": "1200",
"children": [{
"label": "保定市",
"value": "1340"
}, {
"label": "唐山市",
"value": "1240"
}, {
"label": "廊坊市",
"value": "1460"
}, {
"label": "张家口市",
"value": "1380"
}, {
"label": "承德市",
"value": "1410"
}, {
"label": "沧州市",
"value": "1430"
}, {
"label": "石家庄市",
"value": "1210"
}, {
"label": "秦皇岛市",
"value": "1260"
}, {
"label": "衡水市",
"value": "1480"
}, {
"label": "邢台市",
"value": "1310"
}, {
"label": "邯郸市",
"value": "1270"
}],
}, {
"label": "海南省",
"value": "6400",
"children": [{
"label": "三亚市",
"value": "6420"
}, {
"label": "三沙市",
"value": "6440"
}, {
"label": "海口市",
"value": "6410"
}],
}, {
"label": "新疆自治区",
"value": "",
"children": [{
"label": "乌鲁木齐市",
"value": "8810"
}, {
"label": "伊犁哈萨克",
"value": "8980"
}, {
"label": "克孜勒苏柯尔克孜自治州",
"value": "8930"
}, {
"label": "克拉玛依市",
"value": "8820"
}, {
"label": "博尔塔拉",
"value": "8870"
}, {
"label": "吐鲁番地区",
"value": "8830"
}, {
"label": "和田地区",
"value": "8960"
}, {
"label": "哈密地区",
"value": "8840"
}, {
"label": "喀什地区",
"value": "8940"
}, {
"label": "塔城地区",
"value": "9010"
}, {
"label": "巴音郭楞",
"value": "8880"
}, {
"label": "昌吉回族",
"value": "8850"
}, {
"label": "阿克苏地区",
"value": "8910"
}, {
"label": "阿勒泰地区",
"value": "9020"
}],
}, {
"label": "江西省",
"value": "4200",
"children": [{
"label": "上饶市",
"value": "4330"
}, {
"label": "九江市",
"value": "4240"
}, {
"label": "南昌市",
"value": "4210"
}, {
"label": "吉安市",
"value": "4350"
}, {
"label": "宜春市",
"value": "4310"
}, {
"label": "抚州市",
"value": "4370"
}, {
"label": "新余市",
"value": "4260"
}, {
"label": "景德镇市",
"value": "4220"
}, {
"label": "萍乡市",
"value": "4230"
}, {
"label": "赣州市",
"value": "4280"
}, {
"label": "鹰潭市",
"value": "4270"
}],
}, {
"label": "重庆市",
"value": "6900",
"children": [{
"label": "重庆市",
"value": "6900"
}],
}, {
"label": "云南省",
"value": "7300",
"children": [{
"label": "临沧市",
"value": "7580"
}, {
"label": "丽江市",
"value": "7550"
}, {
"label": "保山市",
"value": "7530"
}, {
"label": "大理白族州",
"value": "7510"
}, {
"label": "德宏州",
"value": "7540"
}, {
"label": "怒江州",
"value": "7560"
}, {
"label": "文山州",
"value": "7450"
}, {
"label": "昆明市",
"value": "7310"
}, {
"label": "昭通市",
"value": "7340"
}, {
"label": "普洱市",
"value": "7470"
}, {
"label": "曲靖市",
"value": "7360"
}, {
"label": "楚雄彝族州",
"value": "7380"
}, {
"label": "玉溪市",
"value": "7410"
}, {
"label": "红河州",
"value": "7430"
}, {
"label": "西双版纳州",
"value": "7490"
}, {
"label": "迪庆州",
"value": "7570"
}],
}, {
"label": "北京市",
"value": "1000",
"children": [{
"label": "北京市",
"value": "1000"
}],
}, {
"label": "甘肃省",
"value": "",
"children": [{
"label": "临夏回族",
"value": "8360"
}, {
"label": "兰州市",
"value": "8210"
}, {
"label": "嘉峪关市",
"value": "8220"
}, {
"label": "天水市",
"value": "8250"
}, {
"label": "定西市",
"value": "8290"
}, {
"label": "平凉市",
"value": "8330"
}, {
"label": "庆阳市",
"value": "8340"
}, {
"label": "张掖市",
"value": "8270"
}, {
"label": "武威市",
"value": "8280"
}, {
"label": "甘南藏族",
"value": "8380"
}, {
"label": "白银市",
"value": "8240"
}, {
"label": "酒泉市",
"value": "8260"
}, {
"label": "金昌市",
"value": "8230"
}, {
"label": "陇南市",
"value": "8310"
}],
}, {
"label": "山东省",
"value": "4500",
"children": [{
"label": "东营市",
"value": "4550"
}, {
"label": "临沂市",
"value": "4730"
}, {
"label": "威海市",
"value": "4650"
}, {
"label": "德州市",
"value": "4680"
}, {
"label": "日照市",
"value": "4770"
}, {
"label": "枣庄市",
"value": "4540"
}, {
"label": "泰安市",
"value": "4630"
}, {
"label": "济南市",
"value": "4510"
}, {
"label": "济宁市",
"value": "4610"
}, {
"label": "淄博市",
"value": "4530"
}, {
"label": "滨州市",
"value": "4660"
}, {
"label": "潍坊市",
"value": "4580"
}, {
"label": "烟台市",
"value": "4560"
}, {
"label": "聊城市",
"value": "4710"
}, {
"label": "莱芜市",
"value": "4790"
}, {
"label": "菏泽市",
"value": "4750"
}, {
"label": "青岛市",
"value": "4520"
}],
}, {
"label": "陕西省",
"value": "7900",
"children": [{
"label": "咸阳市",
"value": "7950"
}, {
"label": "商洛市",
"value": "8030"
}, {
"label": "安康市",
"value": "8010"
}, {
"label": "宝鸡市",
"value": "7930"
}, {
"label": "延安市",
"value": "8040"
}, {
"label": "榆林市",
"value": "8060"
}, {
"label": "汉中市",
"value": "7990"
}, {
"label": "渭南市",
"value": "7970"
}, {
"label": "西安市",
"value": "7910"
}, {
"label": "铜川市",
"value": "7920"
}],
}, {
"label": "浙江省",
"value": "3300",
"children": [{
"label": "丽水市",
"value": "3430"
}, {
"label": "台州市",
"value": "3450"
}, {
"label": "嘉兴市",
"value": "3350"
}, {
"label": "宁波市",
"value": "3320"
}, {
"label": "杭州市",
"value": "3310"
}, {
"label": "温州市",
"value": "3330"
}, {
"label": "湖州市",
"value": "3360"
}, {
"label": "绍兴市",
"value": "3370"
}, {
"label": "舟山市",
"value": "3420"
}, {
"label": "衢州市",
"value": "3410"
}, {
"label": "金华市",
"value": "3380"
}],
}, {
"label": "内蒙古自治区",
"value": "",
"children": [{
"label": "乌兰察布市",
"value": "2030"
}, {
"label": "乌海市",
"value": "1930"
}, {
"label": "兴安盟",
"value": "1980"
}, {
"label": "包头市",
"value": "1920"
}, {
"label": "呼伦贝尔市",
"value": "1960"
}, {
"label": "呼和浩特市",
"value": "1910"
}, {
"label": "巴彦淖尔市",
"value": "2070"
}, {
"label": "赤峰市",
"value": "1940"
}, {
"label": "通辽市",
"value": "1990"
}, {
"label": "鄂尔多斯市",
"value": "2050"
}, {
"label": "锡林郭勒盟",
"value": "2010"
}, {
"label": "阿拉善盟",
"value": "2080"
}],
}, {
"label": "青海省",
"value": "",
"children": [{
"label": "果洛藏族",
"value": "8570"
}, {
"label": "海东市",
"value": "8520"
}, {
"label": "海北藏族",
"value": "8540"
}, {
"label": "海南藏族",
"value": "8560"
}, {
"label": "海西蒙古族",
"value": "8590"
}, {
"label": "玉树藏族",
"value": "8580"
}, {
"label": "西宁市",
"value": "8510"
}, {
"label": "黄南藏族",
"value": "8550"
}],
}, {
"label": "辽宁省",
"value": "2200",
"children": [{
"label": "丹东市",
"value": "2260"
}, {
"label": "大连市",
"value": "2220"
}, {
"label": "抚顺市",
"value": "2240"
}, {
"label": "朝阳市",
"value": "2340"
}, {
"label": "本溪市",
"value": "2250"
}, {
"label": "沈阳市",
"value": "2210"
}, {
"label": "盘锦市",
"value": "2320"
}, {
"label": "营口市",
"value": "2280"
}, {
"label": "葫芦岛市",
"value": "2360"
}, {
"label": "辽阳市",
"value": "2310"
}, {
"label": "铁岭市",
"value": "2330"
}, {
"label": "锦州市",
"value": "2270"
}, {
"label": "阜新市",
"value": "2290"
}, {
"label": "鞍山市",
"value": "2230"
}],
}, {
"label": "天津市",
"value": "1100",
"children": [{
"label": "天津市",
"value": "1100"
}],
}, {
"label": "黑龙江省",
"value": "2600",
"children": [{
"label": "七台河市",
"value": "2740"
}, {
"label": "伊春市",
"value": "2710"
}, {
"label": "佳木斯市",
"value": "2720"
}, {
"label": "双鸭山市",
"value": "2680"
}, {
"label": "哈尔滨市",
"value": "2610"
}, {
"label": "大兴安岭地区",
"value": "2790"
}, {
"label": "大庆市",
"value": "2690"
}, {
"label": "牡丹江市",
"value": "2750"
}, {
"label": "绥化市",
"value": "2760"
}, {
"label": "鸡西市",
"value": "2660"
}, {
"label": "鹤岗市",
"value": "2670"
}, {
"label": "黑河市",
"value": "2780"
}, {
"label": "齐齐哈尔市",
"value": "2640"
}],
}, {
"label": "广西自治区",
"value": "",
"children": [{
"label": "北海市",
"value": "6230"
}, {
"label": "南宁市",
"value": "6110"
}, {
"label": "崇左市",
"value": "6360"
}, {
"label": "来宾市",
"value": "6350"
}, {
"label": "柳州市",
"value": "6140"
}, {
"label": "桂林市",
"value": "6170"
}, {
"label": "梧州市",
"value": "6210"
}, {
"label": "河池市",
"value": "6280"
}, {
"label": "玉林市",
"value": "6240"
}, {
"label": "百色市",
"value": "6260"
}, {
"label": "贵港市",
"value": "6330"
}, {
"label": "贺州市",
"value": "6340"
}, {
"label": "钦州市",
"value": "6310"
}, {
"label": "防城港市",
"value": "6320"
}],
}, {
"label": "宁夏自治区",
"value": "8700",
"children": [{
"label": "中卫市",
"value": "8750"
}, {
"label": "吴忠市",
"value": "8730"
}, {
"label": "固原市",
"value": "8740"
}, {
"label": "石嘴山市",
"value": "8720"
}, {
"label": "银川市",
"value": "8710"
}],
}, {
"label": "山西省",
"value": "1600",
"children": [{
"label": "临汾市",
"value": "1770"
}, {
"label": "吕梁市",
"value": "1730"
}, {
"label": "大同市",
"value": "1620"
}, {
"label": "太原市",
"value": "1610"
}, {
"label": "忻州市",
"value": "1710"
}, {
"label": "晋中市",
"value": "1750"
}, {
"label": "晋城市",
"value": "1680"
}, {
"label": "朔州市",
"value": "1690"
}, {
"label": "运城市",
"value": "1810"
}, {
"label": "长治市",
"value": "1660"
}, {
"label": "阳泉市",
"value": "1650"
}]
}]
================================================
FILE: common/data.js
================================================
// 数据格式,数据中只需要包含以下字段和数据格式,开发者可以添加字段,比如id等等,不影响组件显示,
// 组件的返回结果是有菜单数组下标形式返回,
// 如果传入数据中有value,也会返回value,开发者可根据返回的下标获取所选中的菜单
/*
[
{
"name":"", //字符串类型 选填项 菜单名称,如不填,则取第一个子菜单的name值,filter和radio类型则将设置为"筛选"
"type":"" //字符串类型 必填项 可取值 hierarchy/filter/radio hierarchy单/多层级菜单(最多三级); filter筛选多选菜单; radio筛选单选菜单
"submenu":[ //对象数组类型 必填项 子菜单数据
{
"name":"", //字符串类型 必填项 菜单名称
"value":"", //字符串类型 选填项 自定义内容,比如id等等,如果填写了,confirm返回的结果中将返回对应选中的value,若菜单无value字段则返回null,filter类型此字段无效果
"submenu":[ //对象数组类型 必填项 子菜单数据
{
"name":"", //字符串类型 必填项 菜单名称
"value":"", //字符串类型 选填项 自定义内容,比如id等等,如果填写了,confirm返回的结果中将返回对应选中的value,若菜单无value字段则返回null
"submenu":[ //对象数组类型 必填项 子菜单数据 filter类型无效
{
"name":"", //字符串类型 必填项 菜单名称 hierarchy类型层级最多到此
"value":"", //字符串类型 选填项 自定义内容,比如id等等,如果填写了,confirm返回的结果中将返回对应选中的value,若菜单无value字段则返回null
}
]
}
]
}
]
}
]
*/
//0.0.4版本起 返回结果将有两部分组成:
/*
{
index:[], //旧版本的下标数组形式
value:[] //菜单中的valve,结构和下标结果数组一样,只是把下标替换成了value而已
}
*/
// 以下演示数据中,我故意把value设置成跟name一样,只是为了方便演示,使示例更加易懂,实际使用时候value应该是一个标识,给后台识别所用的.
// 数据较长,请仔细查看。
export default [
{
"name":'职位筛选',
"type": 'hierarchy',
"submenu": [
{
"name": '休闲娱乐',
"value": "休闲娱乐",
"submenu": [{
"name": "足疗按摩",
"value": "足疗按摩",
"submenu": [{
"name": "按摩推拿",
"value": "按摩推拿"
}, {
"name": "足浴足疗",
"value": "足浴足疗"
}, {
"name": "中医养生",
"value": "中医养生"
}]
}
]
}
]
},
{
"name":'行业筛选',
"type": 'hierarchy',
"submenu": [
{
"name": '休闲娱乐',
"value": "休闲娱乐",
"submenu": [{
"name": "足疗按摩",
"value": "足疗按摩",
"submenu": [{
"name": "按摩推拿",
"value": "按摩推拿"
}, {
"name": "足浴足疗",
"value": "足浴足疗"
}, {
"name": "中医养生",
"value": "中医养生"
}]
}
]
}
]
},
{
"name":'薪资范围',
"type": 'hierarchy',
"submenu": [
{
"name": "全部分类",
"value": "全部分类"
},
{
"name": "面议",
"value": "面议"
},
{
"name": "1-3K",
"value": "1-3K"
},
{
"name": "3-5K",
"value": "3-5K"
},
{
"name": "5-8K",
"value": "5-8K"
},
{
"name": "8-12K",
"value": "8-12K"
},
{
"name": "12-15K",
"value": "12-15K"
},
{
"name": "15-20K",
"value": "15-20K"
},
{
"name": "20K以上",
"value": "20K以上"
}
]
},
{
"name":'经验要求',
"type": 'hierarchy',
"submenu": [
{
"name": "全部分类",
"value": "全部分类"
},
{
"name": "不限",
"value": "不限"
},
{
"name": "1年以内",
"value": "1年以内"
},
{
"name": "1-3年",
"value": "1-3年"
},
{
"name": "3-5年",
"value": "3-5年"
},
{
"name": "5-10年",
"value": "5-10年"
},
{
"name": "10年以上",
"value": "10年以上"
}
]
},
]
================================================
FILE: common/date.js
================================================
// date.js
export function formatDate(date, fmt) {
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
}
let o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds()
};
for (let k in o) {
if (new RegExp(`(${k})`).test(fmt)) {
let str = o[k] + '';
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str));
}
}
return fmt;
}
function padLeftZero(str) {
return ('00' + str).substr(str.length);
}
export function str2Date(dateStr, separator) {
if (!separator) {
separator = "-";
}
let dateArr = dateStr.split(separator);
let year = parseInt(dateArr[0]);
let month;
//处理月份为04这样的情况
if (dateArr[1].indexOf("0") == 0) {
month = parseInt(dateArr[1].substring(1));
} else {
month = parseInt(dateArr[1]);
}
let day = parseInt(dateArr[2]);
let date = new Date(year, month - 1, day);
return date;
}
/**
* 计算两个日期相隔年限,用于计算年龄等
* @param {Object} date1
* @param {Object} date2
*/
export function calYear(date1,date2) {
let a = new Date(date1).getFullYear();
let b = new Date(date2).getFullYear();
console.log(b-a);
return b-a;
}
/**
* 计算两个日期相隔年限,用于计算年龄等
* @param {Object} date1
* @param {Object} date2
*/
export function calCurrentYear(date) {
let a = new Date(date).getFullYear();
let b = new Date().getFullYear();
console.log(b-a);
return b-a;
}
// 时间戳转日期
export function timestampToTime(timestamp) {
// 时间戳为10位需*1000,时间戳为13位不需乘1000
var date = new Date(timestamp);
var Y = date.getFullYear() + "-";
var M =
(date.getMonth() + 1 < 10
? "0" + (date.getMonth() + 1)
: date.getMonth() + 1) + "-";
var D = (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()) + " ";
var h = date.getHours() + ":";
var m = date.getMinutes() + ":";
var s = date.getSeconds();
return Y + M + D + h + m + s;
}
================================================
FILE: common/db.js
================================================
//取值
function get(key,sync = true) {
try {
if(sync){
return uni.getStorageSync(key);
}else{
let data = '';
uni.getStorage({
key:key,
success: function (res) {
data = res.data;
}
});
return data;
}
} catch (e) {
return false;
}
}
//赋值
function set(key, value, sync = true) {
try {
if (sync) {
return uni.setStorageSync(key, value);
} else {
uni.setStorage({
key: key,
data: value
});
}
} catch (e) {
}
}
export {
get,
set
}
================================================
FILE: common/graceChecker.js
================================================
/**
数据验证(表单验证)
来自 grace.hcoder.net
作者 hcoder 深海
*/
module.exports = {
error:'',
check : function (data, rule){
for(var i = 0; i < rule.length; i++){
if (!rule[i].checkType){return true;}
if (!rule[i].name) {return true;}
if (!rule[i].errorMsg) {return true;}
if (!data[rule[i].name]) {this.error = rule[i].errorMsg; return false;}
switch (rule[i].checkType){
case 'string':
var reg = new RegExp('^.{' + rule[i].checkRule + '}$');
if(!reg.test(data[rule[i].name])) {this.error = rule[i].errorMsg; return false;}
break;
case 'int':
var reg = new RegExp('^(-[1-9]|[1-9])[0-9]{' + rule[i].checkRule + '}$');
if(!reg.test(data[rule[i].name])) {this.error = rule[i].errorMsg; return false;}
break;
break;
case 'between':
if (!this.isNumber(data[rule[i].name])){
this.error = rule[i].errorMsg;
return false;
}
var minMax = rule[i].checkRule.split(',');
minMax[0] = Number(minMax[0]);
minMax[1] = Number(minMax[1]);
if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
this.error = rule[i].errorMsg;
return false;
}
break;
case 'betweenD':
var reg = /^-?[1-9][0-9]?$/;
if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
var minMax = rule[i].checkRule.split(',');
minMax[0] = Number(minMax[0]);
minMax[1] = Number(minMax[1]);
if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
this.error = rule[i].errorMsg;
return false;
}
break;
case 'betweenF':
var reg = /^-?[0-9][0-9]?.+[0-9]+$/;
if (!reg.test(data[rule[i].name])){this.error = rule[i].errorMsg; return false;}
var minMax = rule[i].checkRule.split(',');
minMax[0] = Number(minMax[0]);
minMax[1] = Number(minMax[1]);
if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
this.error = rule[i].errorMsg;
return false;
}
break;
case 'same':
if (data[rule[i].name] != rule[i].checkRule) { this.error = rule[i].errorMsg; return false;}
break;
case 'notsame':
if (data[rule[i].name] == rule[i].checkRule) { this.error = rule[i].errorMsg; return false; }
break;
case 'email':
var reg = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
break;
case 'phoneno':
var reg = /^1[0-9]{10,10}$/;
if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
break;
case 'zipcode':
var reg = /^[0-9]{6}$/;
if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
break;
case 'reg':
var reg = new RegExp(rule[i].checkRule);
if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
break;
case 'in':
if(rule[i].checkRule.indexOf(data[rule[i].name]) == -1){
this.error = rule[i].errorMsg; return false;
}
break;
case 'notnull':
if(data[rule[i].name] == null || data[rule[i].name].length < 1){this.error = rule[i].errorMsg; return false;}
break;
}
}
return true;
},
isNumber : function (checkVal){
var reg = /^-?[1-9][0-9]?.?[0-9]*$/;
return reg.test(checkVal);
}
}
================================================
FILE: common/modalHelper.js
================================================
export default (function (bodyCls) {
var scrollTop;
return {
open: function () {
scrollTop = document.scrollingElement.scrollTop;
document.body.classList.add(bodyCls);
document.body.style.top = -scrollTop + 'px';
document.querySelector('.uni-page-head').style.top = 0;
},
close: function () {
document.body.classList.remove(bodyCls);
// scrollTop lost after set position:fixed, restore it back.
document.scrollingElement.scrollTop = scrollTop;
document.body.style.top = "auto";
}
};
})('modal-open');
================================================
FILE: common/router.js
================================================
/*
* 路由对象
* 中心思想:需要路由鉴权,由于uni-app没有vue中的全局钩子函数,所以封装了Router对象。
* 说明:应用中的路由跳转尽量使用该Router的方法,并配合config中的路由表对象进行跳转。
*
* 示例:this.$mRouter.push({route:this.$mRoutesConfig.main,query:{a:1}})
*
*/
class Router {
constructor(arg) {
this.callBack = () => {};
}
beforeEach(callBack) {
if (callBack instanceof Function) this.callBack = callBack;
}
push(to) {
this.callBack("navigateTo", to);
}
redirectTo(to) {
this.callBack("redirectTo", to);
}
reLaunch(to) {
this.callBack("reLaunch", to);
}
switchTab(to) {
this.callBack("switchTab", to);
}
back(delta) {
uni.navigateBack({
delta
})
}
}
export default new Router();
================================================
FILE: common/utils.js
================================================
export default {
/*
* 将cityNo 转 cityName
* cityData:原数据
* cityNo:二级地区编码
*/
getCityName(cityData, cityNo) {
if (!cityNo) return;
if (!(cityData instanceof Array)) return;
// 9112
cityNo += "";
for (let i = 0; i < cityData.length; i++) {
let sheng = cityData[i];
for (let j = 0; j < sheng.children.length; j++) {
let shi = sheng.children[j];
if (shi.value == cityNo) {
// 使用return 终止循环
return `${sheng.label}-${shi.label}`;
}
}
}
},
/*
* obj 转 params字符串参数
* 例子:{a:1,b:2} => a=1&b=2
*/
objParseParam(obj) {
let paramsStr = "";
if (obj instanceof Array) return paramsStr;
if (!(obj instanceof Object)) return paramsStr;
for (let key in obj) {
paramsStr += `${key}=${obj[key]}&`;
}
return paramsStr.substring(0, paramsStr.length - 1);
},
/*
* obj 转 路由地址带参数
* 例子:{a:1,b:2} => /pages/index/index?a=1&b=2
*/
objParseUrlAndParam(path, obj) {
let url = path || "/";
let paramsStr = "";
if (obj instanceof Array) return url;
if (!(obj instanceof Object)) return url;
paramsStr = this.objParseParam(obj);
paramsStr && (url += "?");
url += paramsStr;
return url;
},
/*
* 获取url字符串参数
*/
getRequestParameters(locationhref) {
let href = locationhref || "";
let theRequest = new Object();
let str = href.split("?")[1];
if (str != undefined) {
let strs = str.split("&");
for (let i = 0; i < strs.length; i++) {
theRequest[strs[i].split("=")[0]] = (strs[i].split("=")[1]);
}
}
return theRequest;
},
/*
* 银行卡每四位空格
*/
formatCardNo(cardNo) {
cardNo += "";
return cardNo.replace(/\s/g, '').replace(/[^\d]/g, '').replace(/(\d{4})(?=\d)/g, '$1 ');
},
/**
* 乘法,解决js精度损失问题
* @param {*} arg1
* @param {*} arg2
*/
accMul(arg1, arg2) {
arg1 = arg1 || 0;
var m = 0,
s1 = arg1.toString(),
s2 = arg2.toString();
try {
m += s1.split(".")[1].length
} catch (e) {}
try {
m += s2.split(".")[1].length
} catch (e) {}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
},
// 生成树形结构
transData(jsonArr, idStr, pidStr, childrenStr){
// 存放的最终结果树数组
const result = [];
const id = idStr;
const parentId = pidStr;
const children = childrenStr;
const len = jsonArr.length;
// 遍历得到以id为键名的对象(建立整棵树的索引)
const hash = {};
jsonArr.forEach(item => {
hash[item[id]] = item;
});
for (let j = 0; j < len; j++) {
const jsonArrItem = jsonArr[j];
const hashItem = hash[jsonArrItem[parentId]];
if (hashItem) {
// 如果当前项还没有children属性,则添加该属性并设置为空数组
!hashItem[children] && (hashItem[children] = []);
hashItem[children].push(jsonArrItem);
} else {
result.push(jsonArrItem);
}
}
return result;
}
}
================================================
FILE: components/GoEasyAudioPlayer/GoEasyAudioPlayer.vue
================================================
<template>
<div class="goeasy-audio-player" @click="playAudio">
<div class="audio-facade" :style="{width:Math.ceil(duration)*7 + 50 + 'px'}">
<div class="audio-facade-bg" :class="{'play-icon':play}"> </div>
<div class="audio-seconds">{{Math.ceil(duration) || 1}}</div>
</div>
</div>
</template>
<script>
const innerAudioContext = uni.createInnerAudioContext();
export default {
name: "GoEasyAudioPlayer",
props : ['src', 'duration'],
data () {
return {
play : false
}
},
methods : {
playAudio () {
this.play = true;
this.$mUtils.playAudio(this.src);
setTimeout(() => {
this.play = false;
}, this.duration*1000)
}
}
}
</script>
<style scoped>
.goeasy-audio-player{
margin-top: 12rpx;
-webkit-tap-highlight-color:rgba(0,0,0,0);
}
.audio-facade{
min-width: 20rpx;
padding: 6rpx 10rpx;
height: 72rpx;
line-height: 72rpx;
background: #618DFF;
font-size: 24rpx;
border-radius: 14rpx;
color: #ffffff;
display: flex;
}
.audio-facade-bg{
background: url("./images/voice.png") no-repeat center;
background-size: 30rpx;
width: 40rpx;
}
.audio-facade-bg.play-icon{
background: url("./images/play.gif") no-repeat center;
background-size: 30rpx;
-moz-transform:rotate(180deg);
-webkit-transform:rotate(180deg);
-o-transform:rotate(180deg);
transform:rotate(180deg);
}
.audio-seconds{
display: flex;
align-items: center;
}
</style>
================================================
FILE: components/QS-tabs/QS-tabs.vue
================================================
<template>
<view class="QS-tabs" :style="{
'z-index': zIndex,
'font-size': getFontSize + 'rpx',
'background-color': getBgColor,
'transition-duration': getDuration + 's'
}">
<scroll-view scroll-x class="QS-tabs-scroll" :scroll-left="left" scroll-with-animation :style="{
'z-index': (Number(zIndex) + 1)
}">
<view class="QS-tabs-scroll-box">
<!-- 循环tabs -->
<view class="QS-tabs-scroll-item" :style="{
'height': getHeight + 'rpx',
'line-height': getHeight + 'rpx',
'min-width': getWidth + 'rpx',
'padding': '0 ' + space + 'rpx',
'color': index===getCurrent?getActiveColor:getDefaultColor,
'font-weight': activeBold&&index===getCurrent?'bold':'',
'transition-duration': getDuration + 's',
'font-size': getFontSize + 'rpx',
'z-index': (Number(zIndex) + 2)
}"
v-for="(item, index) in getTabs" :key="index" @tap="emit(index)" :id="preId + index">
<!-- line1 -->
<view v-if="animationMode==='line1'" class="boxStyle" :style="getDurationStyle +( index===getCurrent?getActiveStyle:getDefaultStyle)"></view>
{{item.name || item}}
</view>
<!-- itemBackground -->
<view v-if="hasItemBackground" class="itemBackgroundBox" :style="{
'height': getHeight + 'rpx',
'width': (isLine3&&tabsInfo[animationFinishCurrent]?tabsInfo[animationFinishCurrent].width:tabsInfo[getCurrent].width) + 'px',
'z-index': Number(zIndex) + 1,
'transition-duration': getDuration + 's',
'left': (tabsInfo[getCurrent]?tabsInfo[getCurrent].left:0) + 'px'
}">
<view class="itemBackground" :style="'transition-duration:' + getDuration + 's;' +
'background-color:' + getItemBackgroundColor + ';' +
'box-shadow: 0 0 5rpx 5rpx ' + getItemBackgroundColor + ';' +
itemBackgroundStyle + ';'" />
</view>
<!-- line2 -->
<view v-if="animationMode==='line2'" class="boxStyle2" :style="getLinezIndex + getDurationStyle +
'width:' + lW + 'px;' +
'background-color:' + (lineColor||getActiveColor) + ';' +
line2Style + ';' +
'left:' + line2Dx + 'px;'" />
<view v-if="animationMode==='line3'" class="boxStyle2" :style="getLinezIndex +
'width:' + lW + 'px;' +
'background-color:' + (lineColor||getActiveColor) + ';' +
line2Style + ';' +
'left:' + getLine3Dx + 'px'" />
</view>
</scroll-view>
</view>
</template>
<script>
const {
windowWidth
} = uni.getSystemInfoSync();
const preId = 'QSTabsID_';
export default {
props: {
tabs: { //需循环的标签列表
type: Array,
default () {
return [];
}
},
current: { //当前所在滑块的 index
type: Number,
default: 0
},
height: { //QS-tabs的高度和行高
type: [String, Number],
default: 80
},
minWidth: { //单个tab的最小宽度 //v1.4修改
type: [String, Number],
default: 100
},
fontSize: { //字体大小
type: [String, Number],
default: 30
},
duration: { //过渡动画时长, 单位 s
type: [String, Number],
default: .5
},
activeColor: { //选中项的主题颜色
type: String,
default: '#33cc33'
},
defaultColor: { //未选中项的主题颜色
type: String,
default: '#888'
},
animationLineWidth: { //动画线条的宽度
type: [String, Number],
default: 20
},
line2Style: { //line2线条的样式
type: String,
default: 'height: 8rpx;border-radius: 4rpx;'
},
animationMode: { //动画类型
type: String,
default: 'line1'
},
autoCenter: { //是否自动滚动至中心目标
type: Boolean,
default: true
},
autoCenterMode: { //滚动至中心目标类型
type: String,
default: 'component'
},
activeStyle: { //line1模式选中项的样式
type: String,
default: 'bottom:0;left:50%;transform: translate(-50%,-100%);height: 8rpx;border-radius:4rpx;'
},
defaultStyle: { //line1模式未选中项的样式
type: String,
default: 'bottom:0;left:50%;transform: translate(-50%,-100%);height: 8rpx;border-radius:4rpx;'
},
backgroundColor: { //统一背景颜色
type: String,
default: 'rgba(255,255,255,0)'
},
hasItemBackground: { //是否开启背景追光
type: Boolean,
default: false
},
itemBackgroundColor: { //统一追光背景颜色
type: String,
default: 'rgba(255,255,255,0)'
},
itemBackgroundStyle: { //追光样式
type: String,
default: ''
},
zIndex: { //css的z-index属性值
type: [String, Number],
default: 99
},
swiperWidth: { //line3生效, 外部swiper的宽度, 单位rpx
type: [String, Number],
default: 750
},
space: { //tab间距
type: [String, Number],
default: '20'
},
activeBold: { //当前tab字体是否加粗
type: Boolean,
default: true
},
lineColor: { //line颜色
type: String,
default: ''
}
},
computed: {
isLine3() {
return this.animationMode === 'line3';
},
getCurrent() {
const current = Number(this.current);
if (current > (this.getTabs.length - 1)) {
return (this.getTabs.length - 1)
}
return current;
},
getTabs() {
return this.tabs;
},
getHeight() {
return Number(this.height);
},
getWidth() {
return Number(this.minWidth);
},
getFontSize() {
return this.fontSize;
},
getDuration() {
return Number(this.duration);
},
getBgColor() {
const defaultColor = this.backgroundColor || 'rgba(255,255,255,0)';
if (this.getTabs[this.getCurrent] instanceof Object) {
return this.getTabs[this.getCurrent].backgroundColor || defaultColor;
} else {
return defaultColor;
}
},
getItemBackgroundColor() {
const defaultColor = this.itemBackgroundColor || 'rgba(255,255,255,0)';
if (this.getTabs[this.getCurrent] instanceof Object) {
return this.getTabs[this.getCurrent].itemBackgroundColor || defaultColor;
} else {
return defaultColor;
}
},
getDurationStyle() {
return `transition-duration: ${this.getDuration}s;`
},
getActiveColor() {
let activeColor;
if (this.getTabs[this.getCurrent] instanceof Object) {
if (this.getTabs[this.getCurrent].activeColor) {
activeColor = this.getTabs[this.getCurrent].activeColor;
} else {
activeColor = this.activeColor;
}
} else {
activeColor = this.activeColor;
}
return activeColor;
},
getDefaultColor() {
let defaultColor;
if (this.getTabs[this.getCurrent] instanceof Object) {
if (this.getTabs[this.getCurrent].defaultColor) {
defaultColor = this.getTabs[this.getCurrent].defaultColor;
} else {
defaultColor = this.defaultColor;
}
} else {
defaultColor = this.defaultColor;
}
return defaultColor;
},
getActiveStyle() {
return `width:${this.animationLineWidth}%;background-color:${this.getActiveColor};${this.activeStyle};`;
},
getDefaultStyle() {
return `width:0;background-color:${this.getActiveColor};${this.defaultStyle};`;
},
getLinezIndexNum() {
return Number(this.zIndex) + 2;
},
getLinezIndex() {
return `z-index: ${this.getLinezIndexNum};`;
},
getLine3Dx() {
return Number(this.line3Dx) + Number(this.line3AddDx);
}
},
watch: {
current(n, o) {
this.change(n);
},
tabs() {
this.init();
}
},
data() {
return {
left: 0,
tabsInfo: [],
line2Width: Number(this.animationLineWidth),
setTimeoutFc: null,
componentsWidth: 0,
animationFinishCurrent: this.current,
pxWidth: 0,
lW: 0,
sW: 0,
preId,
line3Dx: 0,
line3AddDx: 0,
line2Dx: 0
}
},
// #ifndef H5
onReady() {
this.init();
},
// #endif
// #ifdef H5
mounted() {
this.init();
},
// #endif
methods: {
init() {
console.log('init');
this.countPx();
let view = uni.createSelectorQuery().in(this);
for (let i = 0; i < this.tabs.length; i++) {
view.select('#' + preId + i).boundingClientRect();
}
view.exec((res) => {
const arr = [];
for (let i = 0; i < res.length; i++) {
arr.push(res[i]);
}
this.tabsInfo = arr;
this.countLine2Dx();
this.countLine3Dx();
let _this = this;
_this.getQuery(() => {
_this.countScrollX();
});
})
},
countLine2Dx() {
if (this.animationMode === 'line2') {
const tab = this.tabsInfo[this.getCurrent];
if(tab) this.line2Dx = tab.left + tab.width / 2 - this.lW / 2;
}
},
countLine3Dx() {
if (this.animationMode === 'line3') {
const tab = this.tabsInfo[this.animationFinishCurrent];
if(tab) this.line3Dx = tab.left + tab.width / 2 - this.lW / 2;
}
},
countPx() {
const w = uni.upx2px(this.getWidth);
this.pxWidth = w;
this.lW = w * (Number(this.animationLineWidth) / 100);
this.sW = uni.upx2px(Number(this.swiperWidth));
},
emit(index) {
this.$emit('change', index);
},
change() {
this.countScrollX();
if (this.animationMode === 'line2') {
this.line2Width = 2;
if (this.setTimeoutFc) clearTimeout(this.setTimeoutFc);
this.setTimeoutFc = setTimeout(() => {
this.line2Width = this.animationLineWidth;
}, this.getDuration * 1000 * 3 / 5);
this.countLine2Dx();
}
},
getQuery(cb) {
try {
let view = uni.createSelectorQuery().in(this).select('.QS-tabs');
view.fields({
size: true
}, data => {
if (data) {
this.componentsWidth = data.width;
if (cb && typeof cb === 'function') cb(data);
} else {
this.retryGetQuery(cb);
}
}).exec();
} catch (e) {
//TODO handle the exception
this.componentsWidth = windowWidth;
}
},
retryGetQuery(cb) {
try {
let view = uni.createSelectorQuery().select('.QS-tabs');
view.fields({
size: true
}, data => {
if (data) {
this.componentsWidth = data.width;
} else {
this.componentsWidth = windowWidth;
}
if (cb && typeof cb === 'function') cb(data);
}).exec();
} catch (e) {
//TODO handle the exception
this.componentsWidth = windowWidth;
}
},
countScrollX() {
if (this.autoCenter) {
let tab;
if(this.isLine3) {
tab = this.tabsInfo[this.animationFinishCurrent];
}else{
tab = this.tabsInfo[this.getCurrent];
}
if(tab) {
let tabCenter = tab.left + tab.width/2;
let fatherWidth;
if (this.autoCenterMode === 'window') {
fatherWidth = windowWidth;
} else {
fatherWidth = this.componentsWidth;
}
this.left = tabCenter - fatherWidth / 2;
}
}
},
setDx(dx) {
const tab = this.tabsInfo[dx>0?(this.animationFinishCurrent + 1):(this.animationFinishCurrent - 1)];
this.line3AddDx = dx / this.sW * (tab?tab.width:this.pxWidth);
},
setFinishCurrent(current) {
this.line3AddDx = 0;
this.animationFinishCurrent = current;
this.countLine3Dx();
}
}
}
</script>
<style scoped>
view,
scroll-view {
box-sizing: border-box;
}
.QS-tabs {
width: 100%;
transition-property: background-color, color;
}
.QS-tabs::-webkit-scrollbar {
display: none;
width: 0 !important;
height: 0 !important;
-webkit-appearance: none;
background: transparent;
}
.QS-tabs-scroll {
width: 100%;
white-space: nowrap;
position: relative;
}
.QS-tabs-scroll-box {
position: relative;
display: flex;
white-space: nowrap !important;
display: block !important;
}
.QS-tabs-scroll-item {
position: relative;
display: inline-block;
text-align: center;
transition-property: background-color, color, font-weight;
}
.content {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.boxStyle {
pointer-events: none;
position: absolute;
transition-property: all;
}
.boxStyle2 {
pointer-events: none;
position: absolute;
bottom: 0;
transition-property: all;
transform: translateY(-100%);
}
.itemBackgroundBox {
pointer-events: none;
position: absolute;
top: 0;
transition-property: left, background-color;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
.itemBackground {
height: 100%;
width: 100%;
transition-property: all;
}
</style>
================================================
FILE: components/m-ad/m-ad.vue
================================================
<template>
<view class="ad-box">
<view class="ad" v-for="(item,index) in list" :key="index">
<image :src="item.src" mode=""></image>
</view>
</view>
</template>
<script>
export default {
props: {
list: Array
},
data() {
return {
};
}
}
</script>
<style lang="scss" scoped>
.ad-box {
display: flex;
justify-content: center;
background: #fff;
margin-top: 10upx;
.ad {
image {
width: 335upx;
height: 185upx;
margin: 15upx;
}
}
}
</style>
================================================
FILE: components/m-cc-btn/m-cc-btn.vue
================================================
<template>
<view class="cc-btn" @tap="handleClick">
<view class="cc-btn__jia"></view>
<view class="cc-btn__txt">
<slot></slot>
</view>
</view>
</template>
<script>
export default{
methods:{
handleClick(){
this.$emit("click")
}
}
}
</script>
<style lang="scss" scoped>
.cc-btn {
width: 590upx;
height: 90upx;
margin: 50upx auto;
border: 1px dotted #fe6812;
display: flex;
justify-content: center;
align-items: center;
font-size: 30upx;
color: #fe6812;
&:active {
opacity: 0.7;
}
&__txt {
display: flex;
justify-content: center;
align-items: center;
height: 50upx;
}
&__jia {
width: 40upx;
height: 40upx;
color: #ccc;
transition: color .25s;
position: relative;
margin-right: 10upx;
&::before {
content: '';
position: absolute;
left: 50%;
top: 50%;
width: 30upx;
transform: translate(-50%, -50%);
border-top: 2px solid #fe6812;
}
&::after {
content: '';
position: absolute;
left: 50%;
top: 50%;
height: 30upx;
transform: translate(-50%, -50%);
border-left: 2px solid #fe6812;
}
}
}
</style>
================================================
FILE: components/m-cc-popup/m-cc-popup.vue
================================================
<template>
<view>
<view :class="{'m-mask':true}" @click="hide" @touchmove.stop.prevent="moveHandle" v-show="showPopup"></view>
<view class="" :class="['m-popup','m-popup-'+position,{'m-popup-show':showPopup}]" :style="{height: popupHeight}"
@touchmove.stop.prevent="moveHandle">
<!-- 定义了titleText props属性 才显示header -->
<view class="m-popup-header">
<slot name="header">
<view class="m-picker__hd" catchtouchmove="true" v-if="titleText">
<view class="m-picker__action">
<view v-if="cancelText" @click="clickCancel">{{cancelText}}</view>
</view>
<view class="m-picker__title">{{titleText}}</view>
<view class="m-picker__action">
<view @click="clickConfirm">
<m-icon type="guanbi" size="40"></m-icon>
</view>
</view>
</view>
</slot>
</view>
<!-- 数据列表 超限自动滚动条 -->
<scroll-view :scroll-y="true" class="scroll-box">
<block v-for="(item,index) in list" :key="index">
<view class="card-item border-bottom-1px" :class="{'card-item-active':currItem.cardNo == item.cardNo}" @click="clickItem(item)">
<view class="card-item__title">
<text class="ellipsis">{{item.bankName}}</text>
<view>
<m-format-card :isStar="true" :cardNo="item.cardNo"></m-format-card>
</view>
</view>
<view class="card-item__phone">
<text>预留手机号</text>
<view>
<m-format-phone :isStar="true" :phone="item.reservedPhoneNo"></m-format-phone>
</view>
</view>
<view class="card-item__icon">
<m-icon type="duigou" color="#fe701f" size="40" v-if="currItem.cardNo == item.cardNo"></m-icon>
</view>
</view>
</block>
<cc-btn @click="toUrl">添加信用卡</cc-btn>
</scroll-view>
<!-- footer底部 -->
<view class="m-popup-footer border-1px">
<slot name="footer">
</slot>
</view>
</view>
</view>
</template>
<script>
import uniLoadMore from "@/components/uni-load-more/uni-load-more.vue"
import mFormatCard from "@/components/m-format-card/m-format-card.vue"
import mFormatPhone from "@/components/m-format-phone/m-format-phone.vue"
import ccBtn from "@/components/m-cc-btn/m-cc-btn.vue"
import mIcon from "@/components/m-icon/m-icon.vue"
export default {
components: {
uniLoadMore,
mFormatCard,
mFormatPhone,
ccBtn,
mIcon
},
props: {
/* popup弹出位置*/
position: {
type: String,
default: 'bottom'
},
/* popup高度 按照750*1334设计稿的尺寸 会自动计算适配 */
height: {
type: String,
default: '850'
},
/* popup header 取消文字 */
cancelText: {
type: String,
default: ""
},
/* popup header 确认文字 */
confirmText: {
type: String,
default: ""
},
/* popup header title标题 */
titleText: {
type: String,
default: ""
}
},
computed: {
popupHeight() {
return uni.upx2px(this.height) + 'px';
}
},
data() {
let offsetTop = 0;
//#ifdef H5
offsetTop = 44;
//#endif
return {
offsetTop: offsetTop,
showPopup: false,
list: [],
currItem: {} // 当前选中的
}
},
methods: {
// 点击蒙层
hide: function() {
this.showPopup = false;
this.$emit('hidePopup');
},
// 点击取消按钮
clickCancel() {
this.showPopup = false;
this.$emit("cancel")
},
// 点击确认按钮
clickConfirm() {
this.showPopup = false;
this.$emit("confirm")
},
// 通过refs调用打开
show() {
this.showPopup = true;
// 容错处理
this.list.length || this.getCardList();
},
// 通过refs调用关闭
close() {
this.showPopup = false;
},
// 滚动穿透阻止
moveHandle(e) {
return false;
},
// 滚动事件
scroll(e) {
this.$emit("scroll", e)
},
// 点击item触发
async clickItem(item) {
this.showPopup = false;
this.setCurrSelect(item);
},
// 设置当前选中
setCurrSelect(item) {
this.currItem = item;
this.$emit("onSelect", item);
},
// 跳转信用卡添加
toUrl() {
this.showPopup = false;
this.$mRouter.push({
route: this.$mRoutesConfig.ccAdd
})
},
// 加载列表数据
async getCardList() {
try {
let data = await this.$apis.getCardList();
this.list = data.data.reverse();
this.setDefaultSelect();
} catch (e) {
//TODO handle the exception
this.showPopup = false;
}
},
// 设置默认选中
setDefaultSelect() {
if (this.list instanceof Array && this.list.length !== 0) this.setCurrSelect(this.list[0]);
}
}
}
</script>
<style lang="scss" scoped>
.m-mask {
position: fixed;
z-index: 100;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(0, 0, 0, .2);
}
.m-popup {
position: fixed;
left: 0;
bottom: 0;
z-index: 101;
transition: transform 0.3s ease;
max-height: 100%;
box-shadow: 0 0 30upx rgba(0, 0, 0, .1);
display: flex;
flex-direction: column;
border-radius: 20upx 20upx 0 0;
overflow: hidden;
background: #fff;
}
.m-popup-bottom {
width: 100%;
transform: translate3d(0, 100%, 0);
}
.m-popup-right {
width: 600upx;
height: 100%;
top: 0;
right: 0;
bottom: auto;
left: auto;
transform: translate3d(100%, 0, 0);
}
.m-popup-left {
width: 600upx;
height: 100%;
top: 0;
left: 0;
bottom: auto;
right: auto;
transform: translate3d(-100%, 0, 0);
}
.m-popup-show {
transform: translate3d(0, 0, 0);
}
.m-popup-header {
.m-picker__hd {
display: flex;
// padding: 9px 0px;
height: 88upx;
background-color: #fff;
position: relative;
text-align: center;
font-size: 34upx;
align-items: stretch;
}
.m-picker__hd:after {
content: ' ';
position: absolute;
left: 0;
bottom: 0;
right: 0;
height: 1px;
border-bottom: 1px solid #e5e5e5;
color: #e5e5e5;
transform-origin: 0 100%;
transform: scaleY(0.5);
}
.m-picker__title {
flex: 1;
line-height: 88upx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.m-picker__action {
display: block;
color: #aaa;
font-size: 30upx;
display: flex;
width: 140upx;
view {
display: flex;
flex: 1;
align-items: stretch;
justify-content: center;
align-items: center;
}
}
.m-picker__action:first-child {
text-align: left;
color: #888;
}
.m-picker__action:last-child {
text-align: right;
}
}
.scroll-box {
display: flex;
flex: 1;
}
.card-item-active {
background: #fff7f3;
}
.card-item {
padding: 20upx;
display: flex;
box-sizing: border-box;
color: #535353;
&__title {
display: flex;
flex-direction: column;
width: 450upx;
view {
color: #989898;
font-size: 26upx;
margin-top: 5upx;
}
}
&__phone {
display: flex;
flex-direction: column;
view {
color: #989898;
font-size: 26upx;
margin-top: 5upx;
}
}
&__icon {
// width: 40upx;
flex: 1;
display: flex;
align-items: center;
justify-content: center;
}
}
.m-popup-footer {}
</style>
================================================
FILE: components/m-cell/m-cell.vue
================================================
<template>
<view class='m-cell' :class="{'bottom-line':bottomLine,'top-line':topLine}" @click="click">
<slot name="icon"></slot>
<view class='title' :class="{'ml-20':isIcon}">{{title}}</view>
<view class='desc' v-if="desc">{{desc}}</view>
<view class="cont" v-else><slot></slot></view>
<image v-if="isLink" class='link-icon' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAgCAMAAAAootjDAAAAPFBMVEUAAACZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlr8OySAAAAE3RSTlMABA2nfQeel5GKr4R1FLppzsxxRm9JNQAAAFhJREFUKM+l0UsOgDAIBFBa7Qdbv3P/u7pwByQ1heXLkBCGHHNzkFRQpYWKYlmSxjpHjKxyDUv8YbQ6rGPbpZ04xvSoxW5JVCdMSEPWksRTx0JGGddXo39eigoD2cYeb8gAAAAASUVORK5CYII='
alt="">
</image>
</view>
</template>
<script>
export default {
props: {
title: String,
desc: [String,Number],
isLink: Boolean,
bottomLine: Boolean,
topLine: Boolean,
isIcon:Boolean
},
methods: {
click() {
this.$emit('click')
}
}
}
</script>
<style lang="scss" scoped>
.m-cell {
position: relative;
display: flex;
background-color: #fff;
padding: 24upx 20upx;
box-sizing: border-box;
align-items: center;
.title {
width: 25%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.ml-20{
margin-left: 20upx;
}
.desc {
color: #666;
flex: 1;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
text-align: right;
padding: 0 20upx;
box-sizing: border-box;
/* display: table-cell; */
/* line-height: 30rpx; */
/* vertical-align:middle; */
}
.cont {
flex: 1;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
padding: 0 20upx;
box-sizing: border-box;
}
.link-icon {
width: 20upx;
height: 34upx;
margin-left: 6upx;
}
.mr-l {
margin-right: 20upx;
}
}
.bottom-line {
&:after {
position: absolute;
right: 0;
bottom: 0;
left: 20upx;
height: 1upx;
content: '';
-webkit-transform: scaleY(.5);
transform: scaleY(.5);
background-color: #e2e2e2;
}
}
.top-line {
&:before {
position: absolute;
right: 0;
top: 0;
left: 20upx;
height: 1upx;
content: '';
-webkit-transform: scaleY(.5);
transform: scaleY(.5);
background-color: #e2e2e2;
}
}
</style>
================================================
FILE: components/m-codedialog/m-codedialog.vue
================================================
<template>
<view v-if="show" class="codedialog">
<view class="mask"></view>
<view class="dialog-view">
<text class="dialog-close" @click="closeDialog()"></text>
<view class="dialog-hd">
<view class="codedialog-maintitle">
<text>发送验证码</text>
</view>
<view v-if="phone!='' && phone !=null " class="codedialog-subtitle">
<text>已发送到手机号:{{phoneStr}}</text>
</view>
</view>
<view class="dialog-bd">
<view class="code-view">
<view v-for="(code,index) of codeAry" :key="index" class="code-item">{{code.val}}</view>
</view>
</view>
<view class="dialog-ft">
<view v-if="countdown==60" @click="resend" class="resend">重新发送</view>
<view v-if="countdown<60" class="countdown">{{countdown}}s</view>
</view>
</view>
<view class="keyboard">
<view class="keyboard-line">
<view data-val="1" @click="bindKeyEvent" class="button-item">1</view>
<view data-val="2" @click="bindKeyEvent" class="button-item">2</view>
<view data-val="3" @click="bindKeyEvent" class="button-item">3</view>
</view>
<view class="keyboard-line">
<view data-val="4" @click="bindKeyEvent" class="button-item">4</view>
<view data-val="5" @click="bindKeyEvent" class="button-item">5</view>
<view data-val="6" @click="bindKeyEvent" class="button-item">6</view>
</view>
<view class="keyboard-line">
<view data-val="7" @click="bindKeyEvent" class="button-item">7</view>
<view data-val="8" @click="bindKeyEvent" class="button-item">8</view>
<view data-val="9" @click="bindKeyEvent" class="button-item">9</view>
</view>
<view class="keyboard-line">
<view data-val="clear" @click="bindKeyEvent" class="button-item">清空</view>
<view data-val="0" @click="bindKeyEvent" class="button-item">0</view>
<view data-val="delete" @click="bindKeyEvent" class="button-item">x</view>
</view>
</view>
</view>
</template>
<script>
export default {
props: {
show: {
type: Boolean,
default: false
},
autoCountdown: {
type: Boolean,
default: true
},
phone: {
type: String,
default: ""
},
len: {
type: Number,
default: 6
}
},
data() {
return {
codeAry: [{
"val": ""
}, {
"val": ""
}, {
"val": ""
}, {
"val": ""
}],
currItem: 0,
countdown: 60,
cTimer: null,
callResult: {
type: 0,
code: null
},
suspend: false
};
},
computed: {
phoneStr() {
return this.phone.substr(0, 3) + "****" + this.phone.substr(7);
}
},
watch: {
show: function() {
console.log(this.show)
if (this.show) {
if (!this.suspend) {
this.init();
}
} else {
if (!this.suspend) {
this.clearTimer();
}
this.clearCode();
}
}
},
methods: {
init: function() {
var codeAry = [];
for (var i = 0; i < this.len; i++) {
codeAry.push({
val: ""
})
}
this.codeAry = codeAry;
this.currItem = 0;
if (this.autoCountdown) {
this.startTimer();
}
},
bindKeyEvent: function(e) {
var _this = this;
var val = e.currentTarget.dataset.val;
switch (val) {
case "clear":
_this.clearCode();
break;
case "delete":
_this.deleteCode();
break;
default:
_this.inputVal(val);
break;
}
},
inputVal: function(val) {
if (this.currItem < this.len) {
this.codeAry[this.currItem].val = val;
this.currItem++;
}
if (this.currItem == this.len) {
this.execuCall(1);
}
},
clearCode: function() {
console.log(123)
this.init();
},
deleteCode: function() {
if (this.currItem > 0) {
this.codeAry[this.currItem - 1].val = "";
this.currItem--;
}
},
closeDialog: function() {
this.execuCall(-1);
},
startTimer: function() {
var _this = this;
if (_this.cTimer == null) {
_this.cTimer = setInterval(function() {
_this.countdown--;
if (_this.countdown == 0) {
_this.clearTimer();
}
}, 1000)
}
},
clearTimer: function() {
var _this = this;
clearInterval(_this.cTimer);
_this.cTimer = null;
_this.countdown = 60;
},
getCodeValue: function() {
var codeStr = "";
this.codeAry.forEach(function(code) {
codeStr += code.val;
})
return codeStr;
},
execuCall: function(type) {
this.callResult.type = type;
if (type == 1) {
this.callResult.code = this.getCodeValue();
this.clearTimer();
} else {
this.suspend = true;
this.callResult.code = null;
}
this.$emit("change", this.callResult);
},
resend: function() {
var _this = this;
_this.callResult.code = null;
_this.callResult.type = 0;
_this.callResult.resendCall = function() {
_this.init();
}
_this.$emit("change", _this.callResult);
}
}
}
</script>
<style scoped>
.button-item:active {
background: #d4d4d4;
}
.button-item+.button-item {
border-left: 0.1px solid #d4d4d4;
}
.button-item {
flex: 1;
padding: 14px 0px;
}
.keyboard-line+.keyboard-line {
border-top: 0.1px solid #d4d4d4;
}
.keyboard-line {
display: flex;
}
.keyboard {
background: #fff;
position: absolute;
z-index: 999;
width: 100%;
left: 0;
bottom: 0;
font-size: 17px;
}
.dialog-close {
color: #999;
height: 20px;
width: 20px;
font-size: 15px;
top: 5px;
left: 5px;
position: absolute;
}
.dialog-close:before {
content: "\2716";
}
.countdown {
color: #666;
font-size: 16px;
}
.resend {
color: #007aff;
font-size: 16px;
}
.dialog-ft {
margin-top: 10px;
}
.code-view {
display: flex;
text-align: center;
margin: 0 auto;
border-collapse: separate;
border-spacing: 10px 5px;
}
.code-item+.code-item {
margin-left: 5px;
}
.code-item {
flex: 1;
border-bottom: 1px solid #999;
padding-bottom: 2px;
height: 60upx;
display: flex;
align-items: center;
justify-content: center;
font-size: 30upx;
}
.dialog-bd {
margin-top: 5px;
}
.codedialog-subtitle {
margin-top: 5px;
padding: 5px 0px;
font-size: 15px;
line-height: 1.4;
word-wrap: break-word;
word-break: break-all;
color: #999;
}
.dialog-view {
position: fixed;
z-index: 999;
width: 70%;
max-width: 300px;
top: 50%;
left: 50%;
transform: translate(-50%, -120%);
background-color: #fff;
text-align: center;
border-radius: 3px;
overflow: hidden;
padding: 20px 10px;
}
.mask {
position: fixed;
z-index: 999;
top: 0;
right: 0;
left: 0;
bottom: 0;
background: rgba(0, 0, 0, .6);
}
.codedialog {
z-index: 999;
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
box-sizing: border-box;
text-align: center;
}
</style>
================================================
FILE: components/m-company/m-company.vue
================================================
<template>
<view class="m-position">
<view class="item" v-for="(item, index) in list" :key="index" @click="onClick(item)">
<view class="company">
<view>
<image class="logo" :src="item.logo || '/static/img/company.png'"></image>
</view>
<view style="display: flex;flex-direction: row;justify-content: space-between;align-items: center;width:100%;">
<view class="info">
<text class="name">{{item.name}}</text>
<text class="require">{{item.industryName}} · {{item.staffSize}}</text>
<view class="desc">
<text>{{ item.nature }}</text>
<text>{{ item.restTime }}</text>
<text>{{item.workOvertime}}</text>
</view>
</view>
<text class="yzb yzb-next"></text>
</view>
</view>
</view>
</view>
</template>
<script>
import mEmptyData from '@/components/m-empty-data/m-empty-data.vue';
export default {
name: 'm-position',
props: {
list: Array
},
components: {
mEmptyData
},
data() {
return {
no_order_1: this.$mAssetsPath.no_order_1,
};
},
methods: {
onClick(item) {
this.$emit('click', item);
}
}
};
</script>
<style lang="scss">
.m-position {
.item {
background-color: $bgcolor_white;
padding: 30upx 20upx;
border-bottom: 3upx solid $border-color-light;
.company{
// justify-content: space-between;
display: flex;
flex-direction: row;
align-items: center;
}
.logo{
width: 120upx;
height: 120upx;
border-radius: 10upx;
border: 1upx solid $border-color-base;
}
.info{
margin-left: 20upx;
display: flex;
flex-direction: column;
.name{
font-size: $font-size-34;
font-weight: bold;
}
.require{
color: $font-color-666;
margin-top: 5upx;
}
.desc {
// margin: 10upx 0;
margin-top: 5upx;
display: flex;
flex-wrap: wrap;
align-items: center;
align-content: flex-start;
flex-direction: row;
justify-content: flex-start;
text {
font-size: $uni-font-size-sm;
padding: 0upx 10upx;
margin-right: 15upx;
margin-bottom: 8upx;
background-color: $border-color-light;
border-radius: 5upx;
color: $font-color-666;
}
}
}
.yzb-next{
color: $font-color-999;
}
}
}
</style>
================================================
FILE: components/m-empty-data/m-empty-data.vue
================================================
<template>
<view class="m-empty-data">
<view>
<view>
<image :src="coverUrl" mode=""></image>
</view>
<text>
<slot>{{noTxt}}</slot>
</text>
</view>
</view>
</template>
<script>
export default {
props: {
coverUrl: String,
noTxt: {
type: String,
default: "这里空空如也"
}
}
}
</script>
<style lang="scss" scoped>
.m-empty-data {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
&>view {
position: absolute;
top: 50%;
left: 50%;
transform: translate3d(-50%, -50%, 0);
&>view {
width: 220upx;
height: 220upx;
margin: -250upx auto 0;
image {
width: 100%;
height: 100%;
}
}
&>text {
padding: 15upx 0;
font-size: 30upx;
color: #333;
white-space: nowrap;
position: relative;
display: block;
left: 50%;
transform: translateX(-50%);
text-align: center;
}
}
}
</style>
================================================
FILE: components/m-fail/m-fail.vue
================================================
<template>
<view class="fail-page" v-if="status">
<view class="fail-page__icon">
<view>
<image :src="fail_icon" mode=""></image>
</view>
<text>{{customerStatus[status]}}</text>
</view>
<view class="fail-page__action" v-if="status == 'REJECT'">
<button type="primary" size="mini" @tap="toUrl">查看原因</button>
</view>
</view>
</template>
<script>
export default {
props: {
status: String
},
data() {
return {
fail_icon: this.$mAssetsPath.fail_icon,
customerStatus: this.$mConstDataConfig.status,
}
},
onLoad(query) {
},
watch: {
status(newValue, oldValue) {
uni.setNavigationBarTitle({
title: `商户${this.customerStatus[newValue]}`
})
}
},
methods: {
toUrl() {
console.log(this.$mRoutesConfig.userInfo)
this.$mRouter.push({
route: this.$mRoutesConfig.userInfo
})
}
}
}
</script>
<style lang="scss" scoped>
.fail-page {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
padding: 0 50upx;
box-sizing: border-box;
&__icon {
&>view {
width: 240upx;
height: 220upx;
margin: 150upx auto 0;
image {
width: 100%;
height: 100%;
}
}
&>text {
padding: 25upx 0;
font-size: 36upx;
color: #333;
white-space: nowrap;
position: relative;
display: block;
left: 50%;
transform: translateX(-50%);
text-align: center;
}
}
&__action {
margin-top: 50upx;
display: flex;
justify-content: center;
align-items: center;
}
}
</style>
================================================
FILE: components/m-format-card/m-format-card.vue
================================================
<template>
<text>{{value}}</text>
</template>
<script>
export default {
props: {
cardNo: {
type: [String,Number],
default: ""
},
isStar: Boolean
},
computed: {
value() {
let cardNo = this.cardNo + "";
if (this.isStar) {
return `${cardNo.slice(0,4)}******${cardNo.slice(cardNo.length-4,cardNo.length)}`
} else {
return cardNo.replace(/\s/g, '').replace(/[^\d]/g, '').replace(/(\d{4})(?=\d)/g, '$1 ');
}
}
},
}
</script>
<style>
</style>
================================================
FILE: components/m-format-phone/m-format-phone.vue
================================================
<template>
<text>{{value}}</text>
</template>
<script>
export default {
props: {
phone: {
type: String,
default: ""
},
isStar: Boolean
},
computed: {
value() {
let phone = this.phone + "";
if (this.isStar) {
return `${phone.slice(0,3)}******${phone.slice(phone.length-4,phone.length)}`
} else {
return phone;
}
}
},
}
</script>
<style>
</style>
================================================
FILE: components/m-icon/m-icon.css
================================================
@font-face {
font-family: uniicons;
font-weight: normal;
font-style: normal;
src: url('https://img-cdn-qiniu.dcloud.net.cn/fonts/uni.ttf?t=1536565627510') format('truetype');
}
.m-icon {
font-family: uniicons;
font-size: 48upx;
font-weight: normal;
font-style: normal;
line-height: 1;
display: inline-block;
text-decoration: none;
-webkit-font-smoothing: antialiased;
}
.m-icon.uni-active {
color: #007aff;
}
.m-icon-contact:before {
content: '\e100';
}
.m-icon-person:before {
content: '\e101';
}
.m-icon-personadd:before {
content: '\e102';
}
.m-icon-contact-filled:before {
content: '\e130';
}
.m-icon-person-filled:before {
content: '\e131';
}
.m-icon-personadd-filled:before {
content: '\e132';
}
.m-icon-phone:before {
content: '\e200';
}
.m-icon-email:before {
content: '\e201';
}
.m-icon-chatbubble:before {
content: '\e202';
}
.m-icon-chatboxes:before {
content: '\e203';
}
.m-icon-phone-filled:before {
content: '\e230';
}
.m-icon-email-filled:before {
content: '\e231';
}
.m-icon-chatbubble-filled:before {
content: '\e232';
}
.m-icon-chatboxes-filled:before {
content: '\e233';
}
.m-icon-weibo:before {
content: '\e260';
}
.m-icon-weixin:before {
content: '\e261';
}
.m-icon-pengyouquan:before {
content: '\e262';
}
.m-icon-chat:before {
content: '\e263';
}
.m-icon-qq:before {
content: '\e264';
}
.m-icon-videocam:before {
content: '\e300';
}
.m-icon-camera:before {
content: '\e301';
}
.m-icon-mic:before {
content: '\e302';
}
.m-icon-location:before {
content: '\e303';
}
.m-icon-mic-filled:before,
.m-icon-speech:before {
content: '\e332';
}
.m-icon-location-filled:before {
content: '\e333';
}
.m-icon-micoff:before {
content: '\e360';
}
.m-icon-image:before {
content: '\e363';
}
.m-icon-map:before {
content: '\e364';
}
.m-icon-compose:before {
content: '\e400';
}
.m-icon-trash:before {
content: '\e401';
}
.m-icon-upload:before {
content: '\e402';
}
.m-icon-download:before {
content: '\e403';
}
.m-icon-close:before {
content: '\e404';
}
.m-icon-redo:before {
content: '\e405';
}
.m-icon-undo:before {
content: '\e406';
}
.m-icon-refresh:before {
content: '\e407';
}
.m-icon-star:before {
content: '\e408';
}
.m-icon-plus:before {
content: '\e409';
}
.m-icon-minus:before {
content: '\e410';
}
.m-icon-circle:before,
.m-icon-checkbox:before {
content: '\e411';
}
.m-icon-close-filled:before,
.m-icon-clear:before {
content: '\e434';
}
.m-icon-refresh-filled:before {
content: '\e437';
}
.m-icon-star-filled:before {
content: '\e438';
}
.m-icon-plus-filled:before {
content: '\e439';
}
.m-icon-minus-filled:before {
content: '\e440';
}
.m-icon-circle-filled:before {
content: '\e441';
}
.m-icon-checkbox-filled:before {
content: '\e442';
}
.m-icon-closeempty:before {
content: '\e460';
}
.m-icon-refreshempty:before {
content: '\e461';
}
.m-icon-reload:before {
content: '\e462';
}
.m-icon-starhalf:before {
content: '\e463';
}
.m-icon-spinner:before {
content: '\e464';
}
.m-icon-spinner-cycle:before {
content: '\e465';
}
.m-icon-search:before {
content: '\e466';
}
.m-icon-plusempty:before {
content: '\e468';
}
.m-icon-forward:before {
content: '\e470';
}
.m-icon-back:before,
.m-icon-left-nav:before {
content: '\e471';
}
.m-icon-checkmarkempty:before {
content: '\e472';
}
.m-icon-home:before {
content: '\e500';
}
.m-icon-navigate:before {
content: '\e501';
}
.m-icon-gear:before {
content: '\e502';
}
.m-icon-paperplane:before {
content: '\e503';
}
.m-icon-info:before {
content: '\e504';
}
.m-icon-help:before {
content: '\e505';
}
.m-icon-locked:before {
content: '\e506';
}
.m-icon-more:before {
content: '\e507';
}
.m-icon-flag:before {
content: '\e508';
}
.m-icon-home-filled:before {
content: '\e530';
}
.m-icon-gear-filled:before {
content: '\e532';
}
.m-icon-info-filled:before {
content: '\e534';
}
.m-icon-help-filled:before {
content: '\e535';
}
.m-icon-more-filled:before {
content: '\e537';
}
.m-icon-settings:before {
content: '\e560';
}
.m-icon-list:before {
content: '\e562';
}
.m-icon-bars:before {
content: '\e563';
}
.m-icon-loop:before {
content: '\e565';
}
.m-icon-paperclip:before {
content: '\e567';
}
.m-icon-eye:before {
content: '\e568';
}
.m-icon-arrowup:before {
content: '\e580';
}
.m-icon-arrowdown:before {
content: '\e581';
}
.m-icon-arrowleft:before {
content: '\e582';
}
.m-icon-arrowright:before {
content: '\e583';
}
.m-icon-arrowthinup:before {
content: '\e584';
}
.m-icon-arrowthindown:before {
content: '\e585';
}
.m-icon-arrowthinleft:before {
content: '\e586';
}
.m-icon-arrowthinright:before {
content: '\e587';
}
.m-icon-pulldown:before {
content: '\e588';
}
.m-icon-scan:before {
content: "\e612";
}
================================================
FILE: components/m-icon/m-icon.vue
================================================
<template>
<view class="m-icon" :class="['icon-'+type]" :style="{color:color,'font-size':fontSize}" @click="onClick()"></view>
</template>
<script>
export default {
props: {
/**
* 图标类型
*/
type: String,
/**
* 图标颜色
*/
color: String,
/**
* 图标大小
*/
size: {
type: [Number, String],
default: 24
}
},
computed: {
fontSize() {
var size = Number(this.size)
size = isNaN(size) ? 24 : size
return `${size}upx`
}
},
methods: {
onClick() {
this.$emit('click')
}
}
}
</script>
<style>
@import "../../static/icomoon/style.css";
</style>
================================================
FILE: components/m-input/m-input.vue
================================================
<template>
<view class="m-input-view">
<input :focus="focus_" :type="inputType" :value="value" @input="onInput" class="m-input-input" :placeholder="placeholder"
:password="type==='password'&&!showPassword" @focus="onFocus" @blur="onBlur" :maxlength="maxLength" :disabled="disabled"/>
<!-- 优先显示密码可见按钮 -->
<view v-if="clearable_&&!displayable_&& value && value.length" class="m-input-icon">
<m-icon color="#cccccc" type="close" size="40" @click="clear"></m-icon>
</view>
<view v-if="displayable_" class="m-input-icon">
<m-icon :color="showPassword?'#666666':'#cccccc'" type="ai-eye" size="40" @click="display"></m-icon>
</view>
</view>
</template>
<script>
import mIcon from '@/components/m-icon/m-icon.vue'
export default {
components: {
mIcon
},
props: {
/**
* 输入类型
*/
type: String,
/**
* 值
*/
value: String,
/**
* 占位符
*/
placeholder: String,
/**
* 是否显示清除按钮
*/
clearable: {
type: [Boolean, String],
default: false
},
/**
* 是否显示密码可见按钮
*/
displayable: {
type: [Boolean, String],
default: false
},
/**
* 自动获取焦点
*/
focus: {
type: [Boolean, String],
default: false
},
/*
* maxLength
*/
maxLength:{
type:Number,
default:1000
},
/*
* 是否禁用
*/
disabled:{
type:Boolean,
default:false
}
},
model: {
prop: 'value',
event: 'input'
},
data() {
return {
/**
* 显示密码明文
*/
showPassword: false,
/**
* 是否获取焦点
*/
isFocus: false
}
},
computed: {
inputType() {
const type = this.type
return type === 'password' ? 'text' : type
},
clearable_() {
return String(this.clearable) !== 'false'
},
displayable_() {
return String(this.displayable) !== 'false'
},
focus_() {
return String(this.focus) !== 'false'
}
},
methods: {
clear() {
// this.value = ''
this.$emit("input","")
},
display() {
this.showPassword = !this.showPassword
},
onFocus() {
this.isFocus = true
},
onBlur(e) {
this.$nextTick(() => {
this.isFocus = false
this.$emit("onblur",e)
})
},
onInput(e) {
this.$emit('input', e.target.value)
}
}
}
</script>
<style lang="scss" scoped>
.m-input-view {
display: flex;
flex-direction: row;
align-items: center;
width: 100%;
flex: 1;
padding: 20rpx 10rpx;
}
.m-input-input {
flex: 1;
width: 100%;
}
.m-input-icon{
width: 20px;
}
</style>
================================================
FILE: components/m-page-view/m-page-view.vue
================================================
<template>
<view class="m-page-view">
<view class="m-page-view__loading" v-show="joyPageStatus == 'loading'">
<view class="dialog-box">
<image src="data:image/gif;base64,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"
mode=""></image>
</view>
</view>
<view class="m-page-view__fail" v-show="joyPageStatus == 'fail'" @tap="reload">
<view class="dialog-box">
<image src="data:image/png;base64,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"
mode=""></image>
</view>
<view class="tip">
咦,网络不给力呀,点击重试
</view>
</view>
<template v-if="joyPageStatus == 'success'">
<slot></slot>
</template>
</view>
</template>
<script>
export default {
props: {
joyPageStatus: {
type: String,
default: "success"
}
},
data() {
return {}
},
methods: {
reload() {
let pages = getCurrentPages();
let page = pages[pages.length - 1];
console.log(page)
uni.redirectTo({
url: "/" + page.route
})
}
}
}
</script>
<style lang="scss">
.m-page-view {
display: flex;
flex: 1;
flex-direction: column;
background-color: #efeff4;
width: 100%;
&__loading {
display: flex;
// background: rgba(0, 0, 0, 0.1);
flex: 1;
flex-direction: column;
width: 100%;
height: 100%;
justify-content: center;
align-items: center;
.dialog-box {
width: 100upx;
height: 100upx;
// border: 1px solid red;
padding: 50upx;
background: rgba(0, 0, 0, 0.7);
border-radius: 10upx;
image {
width: 100%;
height: 100%;
}
}
}
&__fail {
display: flex;
background: rgba(255, 255, 255, 0.5);
flex: 1;
flex-direction: column;
width: 100%;
height: 100%;
align-items: center;
.dialog-box {
margin-top: 200upx;
width: 300upx;
height: 300upx;
// border: 1px solid red;
// padding: 50upx;
// background: rgba(0, 0, 0, 0.7);
border-radius: 10upx;
image {
width: 100%;
height: 100%;
}
}
.tip {
color: #8f8f8f;
padding: 50upx;
}
}
}
</style>
================================================
FILE: components/m-popup/m-popup.vue
================================================
<template>
<view>
<view :class="{'m-mask':true}" @click="hide" @touchmove.stop.prevent="moveHandle" v-show="showPopup"></view>
<view class="" :class="['m-popup','m-popup-'+position,{'m-popup-show':showPopup}]" :style="{height: popupHeight}"
@touchmove.stop.prevent="moveHandle">
<!-- 如果定义了titleText props属性 才显示header -->
<view class="m-popup-header">
<slot name="header">
<view class="m-picker__hd" catchtouchmove="true" v-if="titleText">
<view class="m-picker__action">
<text @click="clickCancel">{{cancelText}}</text>
</view>
<view class="m-picker__title">{{titleText}}</view>
<view class="m-picker__action" :style="{color:themeColor}">
<text v-if="confirmText" @click="clickConfirm">{{confirmText}}</text>
</view>
</view>
</slot>
</view>
<slot></slot>
<!-- footer底部 -->
<view class="m-popup-footer">
<slot name="footer">
</slot>
</view>
</view>
</view>
</template>
<script>
export default {
props: {
/* popup弹出位置 暂时支持bottom */
position: {
type: String,
default: 'bottom'
},
/* popup高度 按照750*1334设计稿的尺寸 会自动计算适配 */
height: {
type: String,
default: 'auto'
},
/* 确认按钮的颜色 */
themeColor: {
type: String,
default: "#28d966"
},
/* popup header 取消文字 */
cancelText: {
type: String,
default: "取消"
},
/* popup header 确认文字 */
confirmText: {
type: String,
default: ""
},
/* popup header title标题 */
titleText: {
type: String,
default: ""
}
},
computed: {
popupHeight() {
return uni.upx2px(this.height) + 'px';
}
},
data() {
let offsetTop = 0;
//#ifdef H5
offsetTop = 44;
//#endif
return {
offsetTop: offsetTop,
showPopup: false,
}
},
methods: {
hide: function() {
this.showPopup = false;
this.$emit('hidePopup');
},
clickCancel() {
this.showPopup = false;
this.$emit("cancel")
},
clickConfirm() {
this.showPopup = false;
this.$emit("confirm")
},
show() {
this.showPopup = true;
},
close() {
this.showPopup = false;
},
moveHandle(e) {
return false;
},
scroll(e) {
this.$emit("scroll", e)
}
}
}
</script>
<style lang="scss" scoped>
.m-mask {
position: fixed;
z-index: 100;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(0, 0, 0, .3);
}
.m-popup {
position: fixed;
left: 0;
bottom: 0;
background: #eee;
z-index: 101;
transition: transform 0.3s ease;
max-height: 100%;
// overflow-y: auto;
// -webkit-overflow-scrolling: touch;
box-shadow: 0 0 30upx rgba(0, 0, 0, .1);
display: flex;
flex-direction: column;
}
.m-popup-bottom {
width: 100%;
transform: translate3d(0, 100%, 0);
}
.m-popup-right {
width: 600upx;
height: 100%;
top: 0;
right: 0;
bottom: auto;
left: auto;
transform: translate3d(100%, 0, 0);
}
.m-popup-left {
width: 600upx;
height: 100%;
top: 0;
left: 0;
bottom: auto;
right: auto;
transform: translate3d(-100%, 0, 0);
}
.m-popup-show {
transform: translate3d(0, 0, 0);
}
.m-popup-header {
.m-picker__hd {
display: flex;
// padding: 9px 0px;
height: 88upx;
background-color: #fff;
position: relative;
text-align: center;
font-size: 34upx;
align-items: stretch;
}
.m-picker__hd:after {
content: ' ';
position: absolute;
left: 0;
bottom: 0;
right: 0;
height: 1px;
border-bottom: 1px solid #e5e5e5;
color: #e5e5e5;
transform-origin: 0 100%;
transform: scaleY(0.5);
}
.m-picker__title {
flex: 1;
line-height: 88upx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.m-picker__action {
display: block;
color: #1aad19;
font-size: 30upx;
display: flex;
width: 140upx;
text {
display: flex;
flex: 1;
align-items: stretch;
justify-content: center;
align-items: center;
}
}
.m-picker__action:first-child {
text-align: left;
color: #888;
}
.m-picker__action:last-child {
text-align: right;
}
}
// .m-popup-scroll-box {
// flex: 1;
// display: flex;
// }
.m-popup-footer {}
</style>
================================================
FILE: components/m-popup-header/m-popup-header.vue
================================================
<template>
<view class="mpvue-picker__hd" catchtouchmove="true">
<view class="mpvue-picker__action" @click="clickCancel">{{cancelText}}</view>
<view class="">
<slot></slot>
</view>
<view class="mpvue-picker__action" :style="{color:themeColor}" @click="clickConfirm">{{confirmText}}</view>
</view>
</template>
<script>
export default{
props:{
themeColor:{
type:String,
default:"#aaa"
},
cancelText:{
type:String,
default:"取消"
},
confirmText:{
type:String,
default:"确定"
}
},
methods:{
clickCancel(){
this.$emit("cancel")
},
clickConfirm(){
this.$emit("confirm")
}
}
}
</script>
<style lang="scss" scoped>
.mpvue-picker__hd {
display: flex;
padding: 9px 15px;
background-color: #fff;
position: relative;
text-align: center;
font-size: 17px;
}
.mpvue-picker__hd:after {
content: ' ';
position: absolute;
left: 0;
bottom: 0;
right: 0;
height: 1px;
border-bottom: 1px solid #e5e5e5;
color: #e5e5e5;
transform-origin: 0 100%;
transform: scaleY(0.5);
}
.mpvue-picker__action {
display: block;
flex: 1;
color: #1aad19;
}
.mpvue-picker__action:first-child {
text-align: left;
color: #888;
}
.mpvue-picker__action:last-child {
text-align: right;
}
</style>
================================================
FILE: components/m-position/m-position.vue
================================================
<template>
<view class="m-position">
<view class="item" v-for="(item, index) in positions" :key="index" @click="onClick(item)">
<view class="title space-between">
<view class="left">
<text class="title-parttime">{{item.jobType}}</text>
<text class="title-name">{{ item.postName }}</text>
</view>
<text class="right">{{ item.salary }}</text>
</view>
<view class="company">
<view class="left">
{{ item.companyName }}
<view class="height-line"></view>
{{ item.staffSize }}
<view class="height-line"></view>
{{ item.nature }}
</view>
<!-- <view class="right">
<text class="address">{{formatDistance(item.distance)}}</text>
</view> -->
</view>
<view class="desc">
<text>{{ item.expRequire }}</text>
<text>{{ item.minEducation }}</text>
</view>
<view class="user">
<view class="left">
<image :src="item.userAvatar"></image>
<text class="name">{{ item.username }}</text>
</view>
<view class="right">
<text class="address">{{item.address}}</text>
</view>
</view>
</view>
</view>
</template>
<script>
import mEmptyData from '@/components/m-empty-data/m-empty-data.vue';
import { formatDate } from '@/common/date';
export default {
name: 'yzb-position',
props: {
positions: Array
},
components: {
mEmptyData
},
data() {
return {
no_order_1: this.$mAssetsPath.no_order_1
};
},
methods: {
onClick(item) {
this.$emit('click', item);
},
formatCreateTime(time) {
if (time == null || time === '') {
return null;
}
let str = time.replace(/-/g,'/');
let date = new Date(str);
return formatDate(date, 'MM月dd日');
},
formatDistance(distance){
if(distance){
let a=parseFloat(distance);
if(a>0){
return distance.toFixed(2)+"km"
}else{
return a * 1000 +"m";
}
}
return '0km';
},
}
};
</script>
<style lang="scss">
.m-position {
.item {
background-color: $bgcolor_white;
padding: 30upx 20upx;
// margin-bottom: 20upx;
border-bottom: 10upx solid $border-color-light;
}
}
.space-between {
display: flex;
justify-content: space-between;
flex-direction: row;
}
.title {
.left {
}
.title-name{
font-weight: bold;
font-size: $uni-font-size-lg;
}
.title-parttime{
color: $font-color-orange;
border: 1upx solid $font-color-orange;
font-size: $uni-font-size-sm;
margin-right: 15upx;
padding: 5upx 10upx;
border-radius: 6upx;
}
.title-share {
color: $main-color;
border: 1upx solid $main-color;
border-radius: 20upx 0upx;
// height: 38upx;
// width: 130upx;
font-size: $uni-font-size-sm;
margin-left: 20upx;
padding: 0upx 10upx;
}
.right {
color: $main-color;
font-weight: bold;
font-size: 32upx;
}
}
.company {
color: $font-color-666;
font-size: $uni-font-size-sm;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
.height-line {
height: 20upx;
width: 4upx;
background-color: $font-color-ccc;
margin: 0 15upx;
}
.left {
display: flex;
flex-direction: row;
align-items: center;
margin-right: 15upx;
text{
margin-right:10upx;
font-size: $uni-font-size-sm;
}
}
.right{
text{
font-size: $uni-font-size-sm;
}
}
.yzb-yirenzheng1{
color: $uni-color-success;
}
}
.share {
color: $font-color-999;
// margin-top: 5upx;
font-size: $uni-font-size-base;
display: flex;
flex-direction: row;
align-items: center;
.height-line {
height: 20upx;
width: 4upx;
background-color: $font-color-ccc;
margin: 0 15upx;
}
}
.desc {
// margin: 10upx 0;
margin-top: 5upx;
display: flex;
flex-wrap: wrap;
align-items: center;
align-content: flex-start;
flex-direction: row;
justify-content: flex-start;
text {
font-size: $uni-font-size-sm;
padding: 0upx 10upx;
margin-right: 15upx;
margin-bottom: 8upx;
background-color: $border-color-light;
border-radius: 5upx;
color: $font-color-666;
}
}
.user {
// border-top: 1upx dotted $border-color-light;
padding-top: 10upx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
image {
width: 60upx;
height: 60upx;
border-radius: 30upx;
}
.left {
display: flex;
flex-direction: row;
align-items: center;
font-size: $uni-font-size-sm;
color: $font-color-666;
.name {
margin: 0 20upx;
}
.post {
// color: $font-color-666;
}
}
.right {
display: flex;
flex-direction: row;
align-items: center;
.area {
margin-right: 15upx;
}
text{
color: $font-color-999;
font-size: $uni-font-size-sm;
}
}
}
</style>
================================================
FILE: components/m-qrcode/m-qrcode.vue
================================================
<template xlang="wxml" minapp="mpvue">
<view class="_qrCode">
<canvas class="_qrCodeCanvas" id="_myQrCodeCanvas" canvas-id="_myQrCodeCanvas" :style="{width:cSize+'px',height:cSize+'px'}" />
<image v-if="show" :src="result" :style="{width:cSize+'px',height:cSize+'px'}" />
</view>
</template>
<script>
import QRCode from "./qrcode.js"
let qrcode
export default {
name: "tki-qrcode",
props: {
size: {
type: Number,
default: 200
},
show: {
type: Boolean,
default: true
},
val: {
type: String,
default: ''
},
background: {
type: String,
default: '#000000'
},
foreground: {
type: String,
default: '#ffffff'
},
pdground: {
type: String,
default: '#ffffff'
},
icon: {
type: String,
default: ''
},
iconSize: {
type: Number,
default: 40
},
lv: {
type: Number,
default: 3
},
},
data() {
return {
cSize: this.size,
result: '',
}
},
methods: {
_makeCode() {
let that = this
qrcode = new QRCode({
text: that.val, // 生成内容
size: that.cSize, // 二维码大小
background: that.background, // 背景色
foreground: that.foreground, // 前景色
pdground: that.pdground, // 定位角点颜色
correctLevel: that.lv, // 容错级别
image: that.icon, // 二维码图标
imageSize: that.iconSize,// 二维码图标大小
cbResult: function (res) { // 生成二维码的回调
that._result(res)
}
});
},
_clearCode() {
this._result('')
qrcode.clear()
},
_saveCode() {
let that = this;
if (this.result != "") {
uni.saveImageToPhotosAlbum({
filePath: that.result,
success: function () {
uni.showToast({
title: '二维码保存成功',
icon: 'success',
duration: 2000
});
}
});
}
},
_result(res) {
this.result = res;
this.$emit('result', res)
}
},
computed: {
},
watch: {
size: function (n, o) {
if (n != o) {
this.cSize = n
setTimeout(() => {
this._makeCode()
}, 100);
}
}
},
onLoad: function () {
// console.log(this.val)
}
}
</script>
<style>
._qrCode {
position: relative;
}
._qrCodeCanvas {
position: fixed;
top: -99999upx;
left: -99999upx;
z-index: -99999;
}
</style>
================================================
FILE: components/m-qrcode/qrcode.js
================================================
let QRCode = {};
(function () {
/**
* 获取单个字符的utf8编码
* unicode BMP平面约65535个字符
* @param {num} code
* return {array}
*/
function unicodeFormat8(code) {
// 1 byte
var c0, c1, c2;
if (code < 128) {
return [code];
// 2 bytes
} else if (code < 2048) {
c0 = 192 + (code >> 6);
c1 = 128 + (code & 63);
return [c0, c1];
// 3 bytes
} else {
c0 = 224 + (code >> 12);
c1 = 128 + (code >> 6 & 63);
c2 = 128 + (code & 63);
return [c0, c1, c2];
}
}
/**
* 获取字符串的utf8编码字节串
* @param {string} string
* @return {array}
*/
function getUTF8Bytes(string) {
var utf8codes = [];
for (var i = 0; i < string.length; i++) {
var code = string.charCodeAt(i);
var utf8 = unicodeFormat8(code);
for (var j = 0; j < utf8.length; j++) {
utf8codes.push(utf8[j]);
}
}
return utf8codes;
}
/**
* 二维码算法实现
* @param {string} data 要编码的信息字符串
* @param {num} errorCorrectLevel 纠错等级
*/
function QRCodeAlg(data, errorCorrectLevel) {
this.typeNumber = -1; //版本
this.errorCorrectLevel = errorCorrectLevel;
this.modules = null; //二维矩阵,存放最终结果
this.moduleCount = 0; //矩阵大小
this.dataCache = null; //数据缓存
this.rsBlocks = null; //版本数据信息
this.totalDataCount = -1; //可使用的数据量
this.data = data;
this.utf8bytes = getUTF8Bytes(data);
this.make();
}
QRCodeAlg.prototype = {
constructor: QRCodeAlg,
/**
* 获取二维码矩阵大小
* @return {num} 矩阵大小
*/
getModuleCount: function () {
return this.moduleCount;
},
/**
* 编码
*/
make: function () {
this.getRightType();
this.dataCache = this.createData();
this.createQrcode();
},
/**
* 设置二位矩阵功能图形
* @param {bool} test 表示是否在寻找最好掩膜阶段
* @param {num} maskPattern 掩膜的版本
*/
makeImpl: function (maskPattern) {
this.moduleCount = this.typeNumber * 4 + 17;
this.modules = new Array(this.moduleCount);
for (var row = 0; row < this.moduleCount; row++) {
this.modules[row] = new Array(this.moduleCount);
}
this.setupPositionProbePattern(0, 0);
this.setupPositionProbePattern(this.moduleCount - 7, 0);
this.setupPositionProbePattern(0, this.moduleCount - 7);
this.setupPositionAdjustPattern();
this.setupTimingPattern();
this.setupTypeInfo(true, maskPattern);
if (this.typeNumber >= 7) {
this.setupTypeNumber(true);
}
this.mapData(this.dataCache, maskPattern);
},
/**
* 设置二维码的位置探测图形
* @param {num} row 探测图形的中心横坐标
* @param {num} col 探测图形的中心纵坐标
*/
setupPositionProbePattern: function (row, col) {
for (var r = -1; r <= 7; r++) {
if (row + r <= -1 || this.moduleCount <= row + r) continue;
for (var c = -1; c <= 7; c++) {
if (col + c <= -1 || this.moduleCount <= col + c) continue;
if ((0 <= r && r <= 6 && (c == 0 || c == 6)) || (0 <= c && c <= 6 && (r == 0 || r == 6)) || (2 <= r && r <= 4 && 2 <= c && c <= 4)) {
this.modules[row + r][col + c] = true;
} else {
this.modules[row + r][col + c] = false;
}
}
}
},
/**
* 创建二维码
* @return {[type]} [description]
*/
createQrcode: function () {
var minLostPoint = 0;
var pattern = 0;
var bestModules = null;
for (var i = 0; i < 8; i++) {
this.makeImpl(i);
var lostPoint = QRUtil.getLostPoint(this);
if (i == 0 || minLostPoint > lostPoint) {
minLostPoint = lostPoint;
pattern = i;
bestModules = this.modules;
}
}
this.modules = bestModules;
this.setupTypeInfo(false, pattern);
if (this.typeNumber >= 7) {
this.setupTypeNumber(false);
}
},
/**
* 设置定位图形
* @return {[type]} [description]
*/
setupTimingPattern: function () {
for (var r = 8; r < this.moduleCount - 8; r++) {
if (this.modules[r][6] != null) {
continue;
}
this.modules[r][6] = (r % 2 == 0);
if (this.modules[6][r] != null) {
continue;
}
this.modules[6][r] = (r % 2 == 0);
}
},
/**
* 设置矫正图形
* @return {[type]} [description]
*/
setupPositionAdjustPattern: function () {
var pos = QRUtil.getPatternPosition(this.typeNumber);
for (var i = 0; i < pos.length; i++) {
for (var j = 0; j < pos.length; j++) {
var row = pos[i];
var col = pos[j];
if (this.modules[row][col] != null) {
continue;
}
for (var r = -2; r <= 2; r++) {
for (var c = -2; c <= 2; c++) {
if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) {
this.modules[row + r][col + c] = true;
} else {
this.modules[row + r][col + c] = false;
}
}
}
}
}
},
/**
* 设置版本信息(7以上版本才有)
* @param {bool} test 是否处于判断最佳掩膜阶段
* @return {[type]} [description]
*/
setupTypeNumber: function (test) {
var bits = QRUtil.getBCHTypeNumber(this.typeNumber);
for (var i = 0; i < 18; i++) {
var mod = (!test && ((bits >> i) & 1) == 1);
this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
}
},
/**
* 设置格式信息(纠错等级和掩膜版本)
* @param {bool} test
* @param {num} maskPattern 掩膜版本
* @return {}
*/
setupTypeInfo: function (test, maskPattern) {
var data = (QRErrorCorrectLevel[this.errorCorrectLevel] << 3) | maskPattern;
var bits = QRUtil.getBCHTypeInfo(data);
// vertical
for (var i = 0; i < 15; i++) {
var mod = (!test && ((bits >> i) & 1) == 1);
if (i < 6) {
this.modules[i][8] = mod;
} else if (i < 8) {
this.modules[i + 1][8] = mod;
} else {
this.modules[this.moduleCount - 15 + i][8] = mod;
}
// horizontal
var mod = (!test && ((bits >> i) & 1) == 1);
if (i < 8) {
this.modules[8][this.moduleCount - i - 1] = mod;
} else if (i < 9) {
this.modules[8][15 - i - 1 + 1] = mod;
} else {
this.modules[8][15 - i - 1] = mod;
}
}
// fixed module
this.modules[this.moduleCount - 8][8] = (!test);
},
/**
* 数据编码
* @return {[type]} [description]
*/
createData: function () {
var buffer = new QRBitBuffer();
var lengthBits = this.typeNumber > 9 ? 16 : 8;
buffer.put(4, 4); //添加模式
buffer.put(this.utf8bytes.length, lengthBits);
for (var i = 0, l = this.utf8bytes.length; i < l; i++) {
buffer.put(this.utf8bytes[i], 8);
}
if (buffer.length + 4 <= this.totalDataCount * 8) {
buffer.put(0, 4);
}
// padding
while (buffer.length % 8 != 0) {
buffer.putBit(false);
}
// padding
while (true) {
if (buffer.length >= this.totalDataCount * 8) {
break;
}
buffer.put(QRCodeAlg.PAD0, 8);
if (buffer.length >= this.totalDataCount * 8) {
break;
}
buffer.put(QRCodeAlg.PAD1, 8);
}
return this.createBytes(buffer);
},
/**
* 纠错码编码
* @param {buffer} buffer 数据编码
* @return {[type]}
*/
createBytes: function (buffer) {
var offset = 0;
var maxDcCount = 0;
var maxEcCount = 0;
var length = this.rsBlock.length / 3;
var rsBlocks = new Array();
for (var i = 0; i < length; i++) {
var count = this.rsBlock[i * 3 + 0];
var totalCount = this.rsBlock[i * 3 + 1];
var dataCount = this.rsBlock[i * 3 + 2];
for (var j = 0; j < count; j++) {
rsBlocks.push([dataCount, totalCount]);
}
}
var dcdata = new Array(rsBlocks.length);
var ecdata = new Array(rsBlocks.length);
for (var r = 0; r < rsBlocks.length; r++) {
var dcCount = rsBlocks[r][0];
var ecCount = rsBlocks[r][1] - dcCount;
maxDcCount = Math.max(maxDcCount, dcCount);
maxEcCount = Math.max(maxEcCount, ecCount);
dcdata[r] = new Array(dcCount);
for (var i = 0; i < dcdata[r].length; i++) {
dcdata[r][i] = 0xff & buffer.buffer[i + offset];
}
offset += dcCount;
var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);
var modPoly = rawPoly.mod(rsPoly);
ecdata[r] = new Array(rsPoly.getLength() - 1);
for (var i = 0; i < ecdata[r].length; i++) {
var modIndex = i + modPoly.getLength() - ecdata[r].length;
ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;
}
}
var data = new Array(this.totalDataCount);
var index = 0;
for (var i = 0; i < maxDcCount; i++) {
for (var r = 0; r < rsBlocks.length; r++) {
if (i < dcdata[r].length) {
data[index++] = dcdata[r][i];
}
}
}
for (var i = 0; i < maxEcCount; i++) {
for (var r = 0; r < rsBlocks.length; r++) {
if (i < ecdata[r].length) {
data[index++] = ecdata[r][i];
}
}
}
return data;
},
/**
* 布置模块,构建最终信息
* @param {} data
* @param {} maskPattern
* @return {}
*/
mapData: function (data, maskPattern) {
var inc = -1;
var row = this.moduleCount - 1;
var bitIndex = 7;
var byteIndex = 0;
for (var col = this.moduleCount - 1; col > 0; col -= 2) {
if (col == 6) col--;
while (true) {
for (var c = 0; c < 2; c++) {
if (this.modules[row][col - c] == null) {
var dark = false;
if (byteIndex < data.length) {
dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
}
var mask = QRUtil.getMask(maskPattern, row, col - c);
if (mask) {
dark = !dark;
}
this.modules[row][col - c] = dark;
bitIndex--;
if (bitIndex == -1) {
byteIndex++;
bitIndex = 7;
}
}
}
row += inc;
if (row < 0 || this.moduleCount <= row) {
row -= inc;
inc = -inc;
break;
}
}
}
}
};
/**
* 填充字段
*/
QRCodeAlg.PAD0 = 0xEC;
QRCodeAlg.PAD1 = 0x11;
//---------------------------------------------------------------------
// 纠错等级对应的编码
//---------------------------------------------------------------------
var QRErrorCorrectLevel = [1, 0, 3, 2];
//---------------------------------------------------------------------
// 掩膜版本
//---------------------------------------------------------------------
var QRMaskPattern = {
PATTERN000: 0,
PATTERN001: 1,
PATTERN010: 2,
PATTERN011: 3,
PATTERN100: 4,
PATTERN101: 5,
PATTERN110: 6,
PATTERN111: 7
};
//---------------------------------------------------------------------
// 工具类
//---------------------------------------------------------------------
var QRUtil = {
/*
每个版本矫正图形的位置
*/
PATTERN_POSITION_TABLE: [
[],
[6, 18],
[6, 22],
[6, 26],
[6, 30],
[6, 34],
[6, 22, 38],
[6, 24, 42],
[6, 26, 46],
[6, 28, 50],
[6, 30, 54],
[6, 32, 58],
[6, 34, 62],
[6, 26, 46, 66],
[6, 26, 48, 70],
[6, 26, 50, 74],
[6, 30, 54, 78],
[6, 30, 56, 82],
[6, 30, 58, 86],
[6, 34, 62, 90],
[6, 28, 50, 72, 94],
[6, 26, 50, 74, 98],
[6, 30, 54, 78, 102],
[6, 28, 54, 80, 106],
[6, 32, 58, 84, 110],
[6, 30, 58, 86, 114],
[6, 34, 62, 90, 118],
[6, 26, 50, 74, 98, 122],
[6, 30, 54, 78, 102, 126],
[6, 26, 52, 78, 104, 130],
[6, 30, 56, 82, 108, 134],
[6, 34, 60, 86, 112, 138],
[6, 30, 58, 86, 114, 142],
[6, 34, 62, 90, 118, 146],
[6, 30, 54, 78, 102, 126, 150],
[6, 24, 50, 76, 102, 128, 154],
[6, 28, 54, 80, 106, 132, 158],
[6, 32, 58, 84, 110, 136, 162],
[6, 26, 54, 82, 110, 138, 166],
[6, 30, 58, 86, 114, 142, 170]
],
G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),
G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),
G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
/*
BCH编码格式信息
*/
getBCHTypeInfo: function (data) {
var d = data << 10;
while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)));
}
return ((data << 10) | d) ^ QRUtil.G15_MASK;
},
/*
BCH编码版本信息
*/
getBCHTypeNumber: function (data) {
var d = data << 12;
while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)));
}
return (data << 12) | d;
},
/*
获取BCH位信息
*/
getBCHDigit: function (data) {
var digit = 0;
while (data != 0) {
digit++;
data >>>= 1;
}
return digit;
},
/*
获取版本对应的矫正图形位置
*/
getPatternPosition: function (typeNumber) {
return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
},
/*
掩膜算法
*/
getMask: function (maskPattern, i, j) {
switch (maskPattern) {
case QRMaskPattern.PATTERN000:
return (i + j) % 2 == 0;
case QRMaskPattern.PATTERN001:
return i % 2 == 0;
case QRMaskPattern.PATTERN010:
return j % 3 == 0;
case QRMaskPattern.PATTERN011:
return (i + j) % 3 == 0;
case QRMaskPattern.PATTERN100:
return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
case QRMaskPattern.PATTERN101:
return (i * j) % 2 + (i * j) % 3 == 0;
case QRMaskPattern.PATTERN110:
return ((i * j) % 2 + (i * j) % 3) % 2 == 0;
case QRMaskPattern.PATTERN111:
return ((i * j) % 3 + (i + j) % 2) % 2 == 0;
default:
throw new Error("bad maskPattern:" + maskPattern);
}
},
/*
获取RS的纠错多项式
*/
getErrorCorrectPolynomial: function (errorCorrectLength) {
var a = new QRPolynomial([1], 0);
for (var i = 0; i < errorCorrectLength; i++) {
a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));
}
return a;
},
/*
获取评价
*/
getLostPoint: function (qrCode) {
var moduleCount = qrCode.getModuleCount(),
lostPoint = 0,
darkCount = 0;
for (var row = 0; row < moduleCount; row++) {
var sameCount = 0;
var head = qrCode.modules[row][0];
for (var col = 0; col < moduleCount; col++) {
var current = qrCode.modules[row][col];
//level 3 评价
if (col < moduleCount - 6) {
if (current && !qrCode.modules[row][col + 1] && qrCode.modules[row][col + 2] && qrCode.modules[row][col + 3] && qrCode.modules[row][col + 4] && !qrCode.modules[row][col + 5] && qrCode.modules[row][col + 6]) {
if (col < moduleCount - 10) {
if (qrCode.modules[row][col + 7] && qrCode.modules[row][col + 8] && qrCode.modules[row][col + 9] && qrCode.modules[row][col + 10]) {
lostPoint += 40;
}
} else if (col > 3) {
if (qrCode.modules[row][col - 1] && qrCode.modules[row][col - 2] && qrCode.modules[row][col - 3] && qrCode.modules[row][col - 4]) {
lostPoint += 40;
}
}
}
}
//level 2 评价
if ((row < moduleCount - 1) && (col < moduleCount - 1)) {
var count = 0;
if (current) count++;
if (qrCode.modules[row + 1][col]) count++;
if (qrCode.modules[row][col + 1]) count++;
if (qrCode.modules[row + 1][col + 1]) count++;
if (count == 0 || count == 4) {
lostPoint += 3;
}
}
//level 1 评价
if (head ^ current) {
sameCount++;
} else {
head = current;
if (sameCount >= 5) {
lostPoint += (3 + sameCount - 5);
}
sameCount = 1;
}
//level 4 评价
if (current) {
darkCount++;
}
}
}
for (var col = 0; col < moduleCount; col++) {
var sameCount = 0;
var head = qrCode.modules[0][col];
for (var row = 0; row < moduleCount; row++) {
var current = qrCode.modules[row][col];
//level 3 评价
if (row < moduleCount - 6) {
if (current && !qrCode.modules[row + 1][col] && qrCode.modules[row + 2][col] && qrCode.modules[row + 3][col] && qrCode.modules[row + 4][col] && !qrCode.modules[row + 5][col] && qrCode.modules[row + 6][col]) {
if (row < moduleCount - 10) {
if (qrCode.modules[row + 7][col] && qrCode.modules[row + 8][col] && qrCode.modules[row + 9][col] && qrCode.modules[row + 10][col]) {
lostPoint += 40;
}
} else if (row > 3) {
if (qrCode.modules[row - 1][col] && qrCode.modules[row - 2][col] && qrCode.modules[row - 3][col] && qrCode.modules[row - 4][col]) {
lostPoint += 40;
}
}
}
}
//level 1 评价
if (head ^ current) {
sameCount++;
} else {
head = current;
if (sameCount >= 5) {
lostPoint += (3 + sameCount - 5);
}
sameCount = 1;
}
}
}
// LEVEL4
var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
lostPoint += ratio * 10;
return lostPoint;
}
};
//---------------------------------------------------------------------
// QRMath使用的数学工具
//---------------------------------------------------------------------
var QRMath = {
/*
将n转化为a^m
*/
glog: function (n) {
if (n < 1) {
throw new Error("glog(" + n + ")");
}
return QRMath.LOG_TABLE[n];
},
/*
将a^m转化为n
*/
gexp: function (n) {
while (n < 0) {
n += 255;
}
while (n >= 256) {
n -= 255;
}
return QRMath.EXP_TABLE[n];
},
EXP_TABLE: new Array(256),
LOG_TABLE: new Array(256)
};
for (var i = 0; i < 8; i++) {
QRMath.EXP_TABLE[i] = 1 << i;
}
for (var i = 8; i < 256; i++) {
QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
}
for (var i = 0; i < 255; i++) {
QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
}
//---------------------------------------------------------------------
// QRPolynomial 多项式
//---------------------------------------------------------------------
/**
* 多项式类
* @param {Array} num 系数
* @param {num} shift a^shift
*/
function QRPolynomial(num, shift) {
if (num.length == undefined) {
throw new Error(num.length + "/" + shift);
}
var offset = 0;
while (offset < num.length && num[offset] == 0) {
offset++;
}
this.num = new Array(num.length - offset + shift);
for (var i = 0; i < num.length - offset; i++) {
this.num[i] = num[i + offset];
}
}
QRPolynomial.prototype = {
get: function (index) {
return this.num[index];
},
getLength: function () {
return this.num.length;
},
/**
* 多项式乘法
* @param {QRPolynomial} e 被乘多项式
* @return {[type]} [description]
*/
multiply: function (e) {
var num = new Array(this.getLength() + e.getLength() - 1);
for (var i = 0; i < this.getLength(); i++) {
for (var j = 0; j < e.getLength(); j++) {
num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
}
}
return new QRPolynomial(num, 0);
},
/**
* 多项式模运算
* @param {QRPolynomial} e 模多项式
* @return {}
*/
mod: function (e) {
var tl = this.getLength(),
el = e.getLength();
if (tl - el < 0) {
return this;
}
var num = new Array(tl);
for (var i = 0; i < tl; i++) {
num[i] = this.get(i);
}
while (num.length >= el) {
var ratio = QRMath.glog(num[0]) - QRMath.glog(e.get(0));
for (var i = 0; i < e.getLength(); i++) {
num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
}
while (num[0] == 0) {
num.shift();
}
}
return new QRPolynomial(num, 0);
}
};
//---------------------------------------------------------------------
// RS_BLOCK_TABLE
//---------------------------------------------------------------------
/*
二维码各个版本信息[块数, 每块中的数据块数, 每块中的信息块数]
*/
var RS_BLOCK_TABLE = [
// L
// M
// Q
// H
// 1
[1, 26, 19],
[1, 26, 16],
[1, 26, 13],
[1, 26, 9],
// 2
[1, 44, 34],
[1, 44, 28],
[1, 44, 22],
[1, 44, 16],
// 3
[1, 70, 55],
[1, 70, 44],
[2, 35, 17],
[2, 35, 13],
// 4
[1, 100, 80],
[2, 50, 32],
[2, 50, 24],
[4, 25, 9],
// 5
[1, 134, 108],
[2, 67, 43],
[2, 33, 15, 2, 34, 16],
[2, 33, 11, 2, 34, 12],
// 6
[2, 86, 68],
[4, 43, 27],
[4, 43, 19],
[4, 43, 15],
// 7
[2, 98, 78],
[4, 49, 31],
[2, 32, 14, 4, 33, 15],
[4, 39, 13, 1, 40, 14],
// 8
[2, 121, 97],
[2, 60, 38, 2, 61, 39],
[4, 40, 18, 2, 41, 19],
[4, 40, 14, 2, 41, 15],
// 9
[2, 146, 116],
[3, 58, 36, 2, 59, 37],
[4, 36, 16, 4, 37, 17],
[4, 36, 12, 4, 37, 13],
// 10
[2, 86, 68, 2, 87, 69],
[4, 69, 43, 1, 70, 44],
[6, 43, 19, 2, 44, 20],
[6, 43, 15, 2, 44, 16],
// 11
[4, 101, 81],
[1, 80, 50, 4, 81, 51],
[4, 50, 22, 4, 51, 23],
[3, 36, 12, 8, 37, 13],
// 12
[2, 116, 92, 2, 117, 93],
[6, 58, 36, 2, 59, 37],
[4, 46, 20, 6, 47, 21],
[7, 42, 14, 4, 43, 15],
// 13
[4, 133, 107],
[8, 59, 37, 1, 60, 38],
[8, 44, 20, 4, 45, 21],
[12, 33, 11, 4, 34, 12],
// 14
[3, 145, 115, 1, 146, 116],
[4, 64, 40, 5, 65, 41],
[11, 36, 16, 5, 37, 17],
[11, 36, 12, 5, 37, 13],
// 15
[5, 109, 87, 1, 110, 88],
[5, 65, 41, 5, 66, 42],
[5, 54, 24, 7, 55, 25],
[11, 36, 12],
// 16
[5, 122, 98, 1, 123, 99],
[7, 73, 45, 3, 74, 46],
[15, 43, 19, 2, 44, 20],
[3, 45, 15, 13, 46, 16],
// 17
[1, 135, 107, 5, 136, 108],
[10, 74, 46, 1, 75, 47],
[1, 50, 22, 15, 51, 23],
[2, 42, 14, 17, 43, 15],
// 18
[5, 150, 120, 1, 151, 121],
[9, 69, 43, 4, 70, 44],
[17, 50, 22, 1, 51, 23],
[2, 42, 14, 19, 43, 15],
// 19
[3, 141, 113, 4, 142, 114],
[3, 70, 44, 11, 71, 45],
[17, 47, 21, 4, 48, 22],
[9, 39, 13, 16, 40, 14],
// 20
[3, 135, 107, 5, 136, 108],
[3, 67, 41, 13, 68, 42],
[15, 54, 24, 5, 55, 25],
[15, 43, 15, 10, 44, 16],
// 21
[4, 144, 116, 4, 145, 117],
[17, 68, 42],
[17, 50, 22, 6, 51, 23],
[19, 46, 16, 6, 47, 17],
// 22
[2, 139, 111, 7, 140, 112],
[17, 74, 46],
[7, 54, 24, 16, 55, 25],
[34, 37, 13],
// 23
[4, 151, 121, 5, 152, 122],
[4, 75, 47, 14, 76, 48],
[11, 54, 24, 14, 55, 25],
[16, 45, 15, 14, 46, 16],
// 24
[6, 147, 117, 4, 148, 118],
[6, 73, 45, 14, 74, 46],
[11, 54, 24, 16, 55, 25],
[30, 46, 16, 2, 47, 17],
// 25
[8, 132, 106, 4, 133, 107],
[8, 75, 47, 13, 76, 48],
[7, 54, 24, 22, 55, 25],
[22, 45, 15, 13, 46, 16],
// 26
[10, 142, 114, 2, 143, 115],
[19, 74, 46, 4, 75, 47],
[28, 50, 22, 6, 51, 23],
[33, 46, 16, 4, 47, 17],
// 27
[8, 152, 122, 4, 153, 123],
[22, 73, 45, 3, 74, 46],
[8, 53, 23, 26, 54, 24],
[12, 45, 15, 28, 46, 16],
// 28
[3, 147, 117, 10, 148, 118],
[3, 73, 45, 23, 74, 46],
[4, 54, 24, 31, 55, 25],
[11, 45, 15, 31, 46, 16],
// 29
[7, 146, 116, 7, 147, 117],
[21, 73, 45, 7, 74, 46],
[1, 53, 23, 37, 54, 24],
[19, 45, 15, 26, 46, 16],
// 30
[5, 145, 115, 10, 146, 116],
[19, 75, 47, 10, 76, 48],
[15, 54, 24, 25, 55, 25],
[23, 45, 15, 25, 46, 16],
// 31
[13, 145, 115, 3, 146, 116],
[2, 74, 46, 29, 75, 47],
[42, 54, 24, 1, 55, 25],
[23, 45, 15, 28, 46, 16],
// 32
[17, 145, 115],
[10, 74, 46, 23, 75, 47],
[10, 54, 24, 35, 55, 25],
[19, 45, 15, 35, 46, 16],
// 33
[17, 145, 115, 1, 146, 116],
[14, 74, 46, 21, 75, 47],
[29, 54, 24, 19, 55, 25],
[11, 45, 15, 46, 46, 16],
// 34
[13, 145, 115, 6, 146, 116],
[14, 74, 46, 23, 75, 47],
[44, 54, 24, 7, 55, 25],
[59, 46, 16, 1, 47, 17],
// 35
[12, 151, 121, 7, 152, 122],
[12, 75, 47, 26, 76, 48],
[39, 54, 24, 14, 55, 25],
[22, 45, 15, 41, 46, 16],
// 36
[6, 151, 121, 14, 152, 122],
[6, 75, 47, 34, 76, 48],
[46, 54, 24, 10, 55, 25],
[2, 45, 15, 64, 46, 16],
// 37
[17, 152, 122, 4, 153, 123],
[29, 74, 46, 14, 75, 47],
[49, 54, 24, 10, 55, 25],
[24, 45, 15, 46, 46, 16],
// 38
[4, 152, 122, 18, 153, 123],
[13, 74, 46, 32, 75, 47],
[48, 54, 24, 14, 55, 25],
[42, 45, 15, 32, 46, 16],
// 39
[20, 147, 117, 4, 148, 118],
[40, 75, 47, 7, 76, 48],
[43, 54, 24, 22, 55, 25],
[10, 45, 15, 67, 46, 16],
// 40
[19, 148, 118, 6, 149, 119],
[18, 75, 47, 31, 76, 48],
[34, 54, 24, 34, 55, 25],
[20, 45, 15, 61, 46, 16]
];
/**
* 根据数据获取对应版本
* @return {[type]} [description]
*/
QRCodeAlg.prototype.getRightType = function () {
for (var typeNumber = 1; typeNumber < 41; typeNumber++) {
var rsBlock = RS_BLOCK_TABLE[(typeNumber - 1) * 4 + this.errorCorrectLevel];
if (rsBlock == undefined) {
throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + this.errorCorrectLevel);
}
var length = rsBlock.length / 3;
var totalDataCount = 0;
for (var i = 0; i < length; i++) {
var count = rsBlock[i * 3 + 0];
var dataCount = rsBlock[i * 3 + 2];
totalDataCount += dataCount * count;
}
var lengthBytes = typeNumber > 9 ? 2 : 1;
if (this.utf8bytes.length + lengthBytes < totalDataCount || typeNumber == 40) {
this.typeNumber = typeNumber;
this.rsBlock = rsBlock;
this.totalDataCount = totalDataCount;
break;
}
}
};
//---------------------------------------------------------------------
// QRBitBuffer
//---------------------------------------------------------------------
function QRBitBuffer() {
this.buffer = new Array();
this.length = 0;
}
QRBitBuffer.prototype = {
get: function (index) {
var bufIndex = Math.floor(index / 8);
return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1);
},
put: function (num, length) {
for (var i = 0; i < length; i++) {
this.putBit(((num >>> (length - i - 1)) & 1));
}
},
putBit: function (bit) {
var bufIndex = Math.floor(this.length / 8);
if (this.buffer.length <= bufIndex) {
this.buffer.push(0);
}
if (bit) {
this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));
}
this.length++;
}
};
// xzedit
let qrcodeAlgObjCache = [];
/**
* 二维码构造函数,主要用于绘制
* @param {参数列表} opt 传递参数
* @return {}
*/
QRCode = function (opt) {
//设置默认参数
this.options = {
text: '',
size: 256,
correctLevel: 3,
background: '#ffffff',
foreground: '#000000',
image: '',
imageSize: 30,
canvasId: '_myQrCodeCanvas'
};
if (typeof opt === 'string') { // 只编码ASCII字符串
opt = {
text: opt
};
}
if (opt) {
for (var i in opt) {
this.options[i] = opt[i];
}
}
//使用QRCodeAlg创建二维码结构
var qrCodeAlg = null;
for (var i = 0, l = qrcodeAlgObjCache.length; i < l; i++) {
if (qrcodeAlgObjCache[i].text == this.options.text && qrcodeAlgObjCache[i].text.correctLevel == this.options.correctLevel) {
qrCodeAlg = qrcodeAlgObjCache[i].obj;
break;
}
}
if (i == l) {
qrCodeAlg = new QRCodeAlg(this.options.text, this.options.correctLevel);
qrcodeAlgObjCache.push({
text: this.options.text,
correctLevel: this.options.correctLevel,
obj: qrCodeAlg
});
}
/**
* 计算矩阵点的前景色
* @param {Obj} config
* @param {Number} config.row 点x坐标
* @param {Number} config.col 点y坐标
* @param {Number} config.count 矩阵大小
* @param {Number} config.options 组件的options
* @return {String}
*/
let getForeGround = function (config) {
var options = config.options;
if (options.pdground && (
(config.row > 1 && config.row < 5 && config.col > 1 && config.col < 5) ||
(config.row > (config.count - 6) && config.row < (config.count - 2) && config.col > 1 && config.col < 5) ||
(config.row > 1 && config.row < 5 && config.col > (config.count - 6) && config.col < (config.count - 2))
)) {
return options.pdground;
}
return options.foreground;
}
// 创建canvas
let createCanvas = function (config) {
uni.showLoading({
title: "二维码生成中",
mask: true
});
var options = config;
var ctx = uni.createCanvasContext(options.canvasId);
var count = qrCodeAlg.getModuleCount();
var ratioSize = options.size;
var ratioImgSize = options.imageSize;
//计算每个点的长宽
var tileW = (ratioSize / count).toPrecision(4);
var tileH = (ratioSize / count).toPrecision(4);
//绘制
for (var row = 0; row < count; row++) {
for (var col = 0; col < count; col++) {
var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW));
var h = (Math.ceil((row + 1) * tileW) - Math.floor(row * tileW));
var foreground = getForeGround({
row: row,
col: col,
count: count,
options: options
});
ctx.setFillStyle(qrCodeAlg.modules[row][col] ? foreground : options.background);
ctx.fillRect(Math.round(col * tileW), Math.round(row * tileH), w, h);
}
}
if (options.image) {
var x = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
var y = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
drawRoundedRect(ctx, x, y, ratioImgSize, ratioImgSize, 2, 6, true, true)
ctx.drawImage(options.image, x, y, ratioImgSize, ratioImgSize);
// 画圆角矩形
function drawRoundedRect(ctxi, x, y, width, height, r, lineWidth, fill, stroke) {
ctxi.setLineWidth(lineWidth);
ctxi.setFillStyle(options.background);
ctxi.setStrokeStyle(options.background);
ctxi.beginPath(); // draw top and top right corner
ctxi.moveTo(x + r, y);
ctxi.arcTo(x + width, y, x + width, y + r, r); // draw right side and bottom right corner
ctxi.arcTo(x + width, y + height, x + width - r, y + height, r); // draw bottom and bottom left corner
ctxi.arcTo(x, y + height, x, y + height - r, r); // draw left and top left corner
ctxi.arcTo(x, y, x + r, y, r);
ctxi.closePath();
if (fill) {
ctxi.fill();
}
if (stroke) {
ctxi.stroke();
}
}
}
ctx.draw(false, () => {
// 保存到临时区域
uni.canvasToTempFilePath({
width: options.width,
height: options.height,
destWidth: options.width,
destHeight: options.height,
canvasId: options.canvasId,
quality: Number(1),
success: function (res) {
if (options.cbResult) {
// 由于官方还没有统一此接口的输出字段,所以先判定下 支付宝为 res.apFilePath
if (!empty(res.tempFilePath)) {
options.cbResult(res.tempFilePath)
} else if (!empty(res.apFilePath)) {
options.cbResult(res.apFilePath)
} else {
options.cbResult(res.tempFilePath)
}
}
},
fail: function (res) {
if (options.cbResult) {
options.cbResult(res)
}
},
complete: function () {
uni.hideLoading();
},
})
})
}
createCanvas(this.options)
// 空判定
let empty = function (v) {
let tp = typeof v,
rt = false;
if (tp == "number" && String(v) == "") {
rt = true
} else if (tp == "undefined") {
rt = true
} else if (tp == "object") {
if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
} else if (tp == "string") {
if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
} else if (tp == "function") {
rt = false
}
return rt
}
};
QRCode.prototype.clear = function (fn) {
var ctx = uni.createCanvasContext(this.options.canvasId)
ctx.clearRect(0, 0, this.options.size, this.options.size)
ctx.draw(false, () => {
if (fn) {
fn()
}
})
};
})()
export default QRCode
================================================
FILE: components/m-swiper/m-swiper.vue
================================================
<template>
<view class="swiper-box">
<swiper class="swiper" :indicator-dots="true" :autoplay="true" :interval="3000" :duration="500" :circular="true"
@change="change">
<swiper-item v-for="(item,index) in list" :key="index">
<view class="swiper-item">
<image class="swiper-item" :src="item" mode="" @click="clickImg(index)" ></image>
</view>
</swiper-item>
</swiper>
<!-- dots -->
<!-- <view class="dtos">
<view class="dto" :class="{'dto-active':index===currIndex}" v-for="(item,index) in list" :key="index"></view>
</view> -->
</view>
</template>
<script>
export default {
props: {
list: Array
},
data() {
return {
currIndex: 0,
};
},
methods: {
change(s) {
this.currIndex = s.detail.current;
},
clickImg(index){
this.$emit("clickImg", index);
},
}
}
</script>
<style lang="scss" scoped>
.swiper-box {
width: 100%;
height: 350upx;
// height: 383upx;
background: #fff;
}
.swiper {
// width: 690upx;
height: 350upx;
// margin: 25upx auto 0;
}
.swiper-item {
width: 100%;
height: 350upx;
}
.dtos {
display: flex;
position: relative;
bottom: 0upx;
margin: 0 auto;
justify-content: center;
// margin-top: 22upx;
.dto {
width: 14upx;
height: 14upx;
border-radius: 500upx;
background: #e5e5e5;
margin: 0 7upx;
transition: width 0.5s;
}
.dto-active {
background: #c2c2c2;
width: 26upx;
}
}
</style>
================================================
FILE: components/m-textarea/m-textarea.vue
================================================
<template>
<view class="r-top">
<textarea :maxlength="len" placeholder-style="color:rgba(153,153,153,1);" v-model="content" :placeholder="pl" />
<view class="r-top-t">
<view></view>
<view> {{contentLength}}/{{len}}</view>
</view>
</view>
</template>
<script>
export default {
computed:{
contentLength(){
return this.content.length;
}
},
props:{
pl:{
type: String,
default: "请输入"
},
len:{
type: Number,
default: 200
}
},
data() {
return {
content:''
}
},
}
</script>
<style>
textarea{
height: 400upx;
width: 100%;
}
.r-top{
padding: 10rpx;
background: #FFFFFF;
border-radius: 20rpx;
height: 100%;
}
.r-top-t{
display: flex;
justify-content: space-between;
font-family:PingFang SC;
font-weight:400;
line-height:20px;
color:rgba(153,153,153,1);
opacity:1;
}
</style>
================================================
FILE: components/m-upimg/m-upimg.1.vue
================================================
<!--
方法upImgData可获取上传图片的所有信息,为数组(可以通过此来计算图片长度以及其它信息)
/**
* <sunsin-upimg url="https://j.dns06.net.cn/index.php?m=Api&c=index&a=uploadDownwind" :autoup="true" :count="2" :upreduce="true" @onUpImg="upData"></sunsin-upimg>限制为3张
* <sunsin-upimg url="https://j.dns06.net.cn/index.php?m=Api&c=index&a=uploadDownwindx" :notli="true" @onUpImg="upImgData"></sunsin-upimg> 不限制上传图片
* url:上传图片地址
* count:上传总数量(默认上传1张图片)
* autoup:是否自动上传(无需传参数,参考以上)
*
* 2019-01-29 MIT
*
* 版本号:v1.1:imgs预览删除增加
* 致谢
* 919809734@qq.com
* 版本号:v1.3:新增不限制上传图片,不必固定三张,以及计算图片
* 致谢
*langice@126.com
*
*/
-->
<template name='sunsin-upimg'>
<view>
<view class="sunsin_picture_list">
<view v-for="(item,index) in upload_picture_list" :key="index" class="sunsin_picture_item">
<image v-show="item.upload_percent < 100" :src="item.path" mode="aspectFill"></image>
<image v-show="item.upload_percent == 100" :src="item.path_server" mode="aspectFill"></image>
<view class="sunsin_upload_progress" v-show="item.upload_percent < 100" :data-index="index" @click="previewImg">{{item.upload_percent}}%</view>
<text class='del' @click='deleteImg' :data-index="index">×</text>
</view>
<view class='sunsin_picture_item' v-show="upload_picture_list.length<count || notli">
<view class="sunsin-add-image" @click='chooseImage(count)'>
<text class="icon-cameraadd"></text>
</view>
</view>
</view>
<view v-show="autoup==false || notli">
<button @click='uploadimage(url)' class='sunsin-yes-upload' v-show="upload_picture_list.length==count">上传图片</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
imgs: [],
upload_picture_list: []
};
},
name: 'sunsin-upimg',
props: {
url: {
type: String,
value: 'https://www.playsort.cn/xxx'
},
count: {
type: Number,
value: 1
},
autoup: {
type: Boolean,
value: false
},
notli: {
type: Boolean,
value: false
},
upreduce: {
type: Boolean,
value: false
}
},
methods: {
chooseImage(addcount) {
cImage(this, parseInt(addcount), this.url);
},
uploadimage(e) {
uImage(this, e);
},
deleteImg(e) {
dImage(e, this);
},
previewImg(e) {
pImage(e, this);
}
}
}
// 上传文件
const upload_file_server = (url, that, upload_picture_list, j) => {
const upload_task = uni.uploadFile({
url,
filePath: upload_picture_list[j]['path'],
name: 'file',
formData: {
'num': j
},
success(res) {
let data = JSON.parse(res.data)
let filename = data.info
let uparr = [];
upload_picture_list[j]['path_server'] = filename
that.upload_picture_list = upload_picture_list
that.$emit('onUpImg', that.upload_picture_list)
}
})
upload_task.onProgressUpdate((res) => {
upload_picture_list[j]['upload_percent'] = res.progress
that.upload_picture_list = upload_picture_list
})
}
// 上传图片(this,api.imageup)
const uImage = (_that, url) => {
for (let j in _that.upload_picture_list) {
if (_that.upload_picture_list[j]['upload_percent'] == 0) {
upload_file_server(url, _that, _that.upload_picture_list, j)
}
}
}
// 删除图片
const dImage = (e, _that) => {
_that.upload_picture_list.splice(e.currentTarget.dataset.index, 1);
_that.imgs.splice(e.currentTarget.dataset.index, 1);
_that.upload_picture_list = _that.upload_picture_list;
}
// 选择图片
const cImage = (_that, count, url) => {
let a = _that.upreduce ? ['compressed'] : ['original'];
console.log(a)
uni.chooseImage({
count,
sizeType: _that.upreduce ? ['compressed'] : ['original'],
sourceType: ['album', 'camera'],
success(res) {
for (let i in res.tempFiles) {
res.tempFiles[i]['upload_percent'] = 0
res.tempFiles[i]['path_server'] = ''
_that.upload_picture_list.push(res.tempFiles[i])
}
if (_that.notli) {
uImage(_that, url);
}
if (_that.autoup) {
console.log(count, _that.upload_picture_list.length)
count == _that.upload_picture_list.length ? uImage(_that, url) : console.log('图片不够!')
}
_that.imgs = _that.imgs.concat(res.tempFilePaths)
_that.upload_picture_list = _that.upload_picture_list;
}
})
}
// 预览图片
const pImage = (e, _that) => {
uni.previewImage({
current: _that.imgs[e.currentTarget.dataset.index],
urls: _that.imgs
})
}
</script>
<!--
此处不添加私缀scoped,方便修改样式
-->
<style>
[class*="icon-"] {
font-family: "iconfont" !important;
font-size: inherit;
font-style: normal;
}
@font-face {
font-family: "iconfont";
src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831');
/* IE9*/
src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831#iefix') format('embedded-opentype'),
/* IE6-IE8 */
url('data:application/x-font-woff;charset=utf-8;base64,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
gitextract_1uh0qe7r/
├── .gitignore
├── App.vue
├── AppEntryController.js
├── LICENSE
├── README.md
├── apis/
│ ├── http.js
│ └── index.js
├── common/
│ ├── auth.js
│ ├── cityData.js
│ ├── data.js
│ ├── date.js
│ ├── db.js
│ ├── graceChecker.js
│ ├── modalHelper.js
│ ├── router.js
│ └── utils.js
├── components/
│ ├── GoEasyAudioPlayer/
│ │ └── GoEasyAudioPlayer.vue
│ ├── QS-tabs/
│ │ └── QS-tabs.vue
│ ├── m-ad/
│ │ └── m-ad.vue
│ ├── m-cc-btn/
│ │ └── m-cc-btn.vue
│ ├── m-cc-popup/
│ │ └── m-cc-popup.vue
│ ├── m-cell/
│ │ └── m-cell.vue
│ ├── m-codedialog/
│ │ └── m-codedialog.vue
│ ├── m-company/
│ │ └── m-company.vue
│ ├── m-empty-data/
│ │ └── m-empty-data.vue
│ ├── m-fail/
│ │ └── m-fail.vue
│ ├── m-format-card/
│ │ └── m-format-card.vue
│ ├── m-format-phone/
│ │ └── m-format-phone.vue
│ ├── m-icon/
│ │ ├── m-icon.css
│ │ └── m-icon.vue
│ ├── m-input/
│ │ └── m-input.vue
│ ├── m-page-view/
│ │ └── m-page-view.vue
│ ├── m-popup/
│ │ └── m-popup.vue
│ ├── m-popup-header/
│ │ └── m-popup-header.vue
│ ├── m-position/
│ │ └── m-position.vue
│ ├── m-qrcode/
│ │ ├── m-qrcode.vue
│ │ └── qrcode.js
│ ├── m-swiper/
│ │ └── m-swiper.vue
│ ├── m-textarea/
│ │ └── m-textarea.vue
│ ├── m-upimg/
│ │ ├── m-upimg.1.vue
│ │ └── m-upimg.vue
│ ├── mpvue-citypicker/
│ │ ├── city-data/
│ │ │ ├── area.js
│ │ │ ├── city.js
│ │ │ └── province.js
│ │ └── mpvueCityPicker.vue
│ ├── mpvue-picker/
│ │ └── mpvue-picker.vue
│ ├── sunui-grand/
│ │ └── sunui-grand.vue
│ ├── uni-load-more/
│ │ ├── readme.md
│ │ └── uni-load-more.vue
│ ├── uni-popup1/
│ │ └── uni-popup.vue
│ └── yzb/
│ ├── yzb-about.vue
│ ├── yzb-apply.vue
│ ├── yzb-browse.vue
│ ├── yzb-classification.vue
│ ├── yzb-connected.vue
│ ├── yzb-filterDropdown.vue
│ ├── yzb-grid.vue
│ ├── yzb-notice.vue
│ └── yzb-resume.vue
├── config/
│ ├── assets.config.js
│ ├── constData.config.js
│ ├── formRule.config.js
│ ├── index.config.js
│ └── routes.config.js
├── lib/
│ ├── EmojiDecoder.js
│ ├── imservice.js
│ └── restapi.js
├── main.js
├── manifest.json
├── pages/
│ ├── chat/
│ │ ├── chat.vue
│ │ ├── notice/
│ │ │ ├── noticeDetail.vue
│ │ │ └── notices.vue
│ │ └── privateChat.vue
│ ├── common/
│ │ ├── industry.vue
│ │ └── post.vue
│ ├── company/
│ │ ├── detail.vue
│ │ ├── list.vue
│ │ └── resumeList.vue
│ ├── login/
│ │ ├── bindphone.vue
│ │ ├── index.vue
│ │ ├── login.vue
│ │ ├── reg.vue
│ │ └── success.vue
│ ├── main/
│ │ ├── main.vue
│ │ └── search.vue
│ ├── position/
│ │ ├── detail.vue
│ │ └── list.vue
│ ├── type/
│ │ └── type.vue
│ └── user/
│ ├── aboutUs.vue
│ ├── apply.vue
│ ├── browse.vue
│ ├── collect.vue
│ ├── company/
│ │ ├── auth.vue
│ │ ├── company.vue
│ │ ├── enter.vue
│ │ ├── position-edit.vue
│ │ └── positions.vue
│ ├── connected.vue
│ ├── contactUs.vue
│ ├── help.vue
│ ├── helpcenterDetails.vue
│ ├── hideSetting.vue
│ ├── person/
│ │ ├── edit-edu.vue
│ │ ├── edit-expect.vue
│ │ ├── edit-pro-content.vue
│ │ ├── edit-pro.vue
│ │ ├── edit-skill.vue
│ │ ├── edit-work-content.vue
│ │ ├── edit-work.vue
│ │ ├── resume.vue
│ │ └── resumeDetail.vue
│ ├── privacy.vue
│ ├── promoCode.vue
│ ├── robot.vue
│ ├── settings.vue
│ ├── terms.vue
│ ├── user.vue
│ └── userInfo.vue
├── pages.json
├── static/
│ ├── css/
│ │ ├── chatInterface.css
│ │ ├── common.css
│ │ └── yzb-icon.css
│ └── icomoon/
│ ├── selection.json
│ └── style.css
├── store/
│ └── index.js
├── uni.scss
└── uni_modules/
├── bctos-rich-text/
│ ├── changelog.md
│ ├── components/
│ │ └── bctos-rich-text/
│ │ └── bctos-rich-text.vue
│ ├── package.json
│ └── readme.md
├── uni-collapse/
│ ├── changelog.md
│ ├── components/
│ │ ├── uni-collapse/
│ │ │ └── uni-collapse.vue
│ │ └── uni-collapse-item/
│ │ └── uni-collapse-item.vue
│ ├── package.json
│ └── readme.md
├── uni-grid/
│ ├── changelog.md
│ ├── components/
│ │ ├── uni-grid/
│ │ │ └── uni-grid.vue
│ │ └── uni-grid-item/
│ │ └── uni-grid-item.vue
│ ├── package.json
│ └── readme.md
├── uni-icons/
│ ├── changelog.md
│ ├── components/
│ │ └── uni-icons/
│ │ ├── icons.js
│ │ └── uni-icons.vue
│ ├── package.json
│ └── readme.md
├── uni-list/
│ ├── changelog.md
│ ├── components/
│ │ ├── uni-list/
│ │ │ ├── uni-list - ╕▒▒╛.vue
│ │ │ ├── uni-list.vue
│ │ │ ├── uni-refresh.vue
│ │ │ └── uni-refresh.wxs
│ │ ├── uni-list-ad/
│ │ │ └── uni-list-ad.vue
│ │ ├── uni-list-chat/
│ │ │ ├── uni-list-chat.scss
│ │ │ └── uni-list-chat.vue
│ │ └── uni-list-item/
│ │ └── uni-list-item.vue
│ ├── package.json
│ └── readme.md
├── uni-popup/
│ ├── changelog.md
│ ├── components/
│ │ ├── uni-popup/
│ │ │ ├── keypress.js
│ │ │ ├── message.js
│ │ │ ├── popup.js
│ │ │ ├── share.js
│ │ │ └── uni-popup.vue
│ │ ├── uni-popup-dialog/
│ │ │ ├── keypress.js
│ │ │ └── uni-popup-dialog.vue
│ │ ├── uni-popup-message/
│ │ │ └── uni-popup-message.vue
│ │ └── uni-popup-share/
│ │ └── uni-popup-share.vue
│ ├── package.json
│ └── readme.md
├── uni-section/
│ ├── changelog.md
│ ├── components/
│ │ └── uni-section/
│ │ └── uni-section.vue
│ ├── package.json
│ └── readme.md
└── uni-transition/
├── changelog.md
├── components/
│ └── uni-transition/
│ └── uni-transition.vue
├── package.json
└── readme.md
SYMBOL INDEX (71 symbols across 19 files)
FILE: AppEntryController.js
class AppEntryController (line 8) | class AppEntryController extends Vue {
method constructor (line 9) | constructor(arg) {
method main (line 14) | async main(query) {
method getWeChatOpenId (line 61) | getWeChatOpenId() {
method handleH5BrowserAddressBarAuth (line 77) | handleH5BrowserAddressBarAuth() {
method customerStatusInterceptor (line 106) | async customerStatusInterceptor() {
FILE: apis/http.js
function HTTP (line 2) | function HTTP(obj, config) {
method GET (line 102) | GET(url, data = {}, config) {
method POST (line 109) | POST(url, data = {}, config) {
method DELETE (line 116) | DELETE(url, data = {}, config) {
method POSTformdata (line 124) | POSTformdata(url, data = {}, config) {
FILE: common/auth.js
function loginCheck (line 1) | function loginCheck(pageObj) {
FILE: common/date.js
function formatDate (line 2) | function formatDate(date, fmt) {
function padLeftZero (line 22) | function padLeftZero(str) {
function str2Date (line 26) | function str2Date(dateStr, separator) {
function calYear (line 50) | function calYear(date1,date2) {
function calCurrentYear (line 62) | function calCurrentYear(date) {
function timestampToTime (line 70) | function timestampToTime(timestamp) {
FILE: common/db.js
function get (line 3) | function get(key,sync = true) {
function set (line 23) | function set(key, value, sync = true) {
FILE: common/router.js
class Router (line 9) | class Router {
method constructor (line 10) | constructor(arg) {
method beforeEach (line 15) | beforeEach(callBack) {
method push (line 19) | push(to) {
method redirectTo (line 23) | redirectTo(to) {
method reLaunch (line 27) | reLaunch(to) {
method switchTab (line 31) | switchTab(to) {
method back (line 35) | back(delta) {
FILE: common/utils.js
method getCityName (line 8) | getCityName(cityData, cityNo) {
method objParseParam (line 29) | objParseParam(obj) {
method objParseUrlAndParam (line 43) | objParseUrlAndParam(path, obj) {
method getRequestParameters (line 57) | getRequestParameters(locationhref) {
method formatCardNo (line 73) | formatCardNo(cardNo) {
method accMul (line 83) | accMul(arg1, arg2) {
method transData (line 98) | transData(jsonArr, idStr, pidStr, childrenStr){
FILE: components/m-qrcode/qrcode.js
function unicodeFormat8 (line 9) | function unicodeFormat8(code) {
function getUTF8Bytes (line 32) | function getUTF8Bytes(string) {
function QRCodeAlg (line 48) | function QRCodeAlg(data, errorCorrectLevel) {
function QRPolynomial (line 642) | function QRPolynomial(num, shift) {
function QRBitBuffer (line 987) | function QRBitBuffer() {
function drawRoundedRect (line 1115) | function drawRoundedRect(ctxi, x, y, width, height, r, lineWidth, fill, ...
FILE: config/assets.config.js
constant PATH (line 3) | const PATH = indexConfig.assetsPath;
FILE: config/index.config.js
constant CONFIG (line 1) | const CONFIG = {
FILE: lib/EmojiDecoder.js
class EmojiDecoder (line 8) | class EmojiDecoder {
method constructor (line 14) | constructor(url,emojiMap) {
method decode (line 24) | decode (text) {
FILE: lib/imservice.js
function Friend (line 3) | function Friend(_id, username, avatar) {
function Group (line 9) | function Group(_id, username, avatar) {
function IMService (line 15) | function IMService(goEasy, GoEasy) {
FILE: lib/restapi.js
function RestApi (line 52) | function RestApi() {
FILE: store/index.js
constant TOKEN (line 12) | const TOKEN = uni.getStorageSync("token") || "";
constant OPENID (line 13) | const OPENID = uni.getStorageSync("openId") || "";
constant USER_INFO (line 14) | const USER_INFO = uni.getStorageSync("userInfo") || {};
constant CUSTOMER_INFO (line 15) | const CUSTOMER_INFO = uni.getStorageSync("customerInfo") || {};
method SET_TOKEN (line 41) | SET_TOKEN(state, token) {
method SET_OPENID (line 45) | SET_OPENID(state, openId) {
method SET_USERINFO (line 49) | SET_USERINFO(state, userInfo) {
method SET_CUSTOMERINFO (line 53) | SET_CUSTOMERINFO(state, customerInfo) {
method SET_LOGOUT (line 57) | SET_LOGOUT(state) {
method reLogin (line 65) | reLogin({
FILE: uni_modules/uni-popup/components/uni-popup-dialog/keypress.js
method mounted (line 10) | mounted () {
FILE: uni_modules/uni-popup/components/uni-popup/keypress.js
method mounted (line 10) | mounted () {
FILE: uni_modules/uni-popup/components/uni-popup/message.js
method created (line 2) | created() {
method customOpen (line 11) | customOpen() {
method customClose (line 16) | customClose() {
FILE: uni_modules/uni-popup/components/uni-popup/popup.js
method data (line 19) | data() {
method isDesktop (line 28) | isDesktop() {
method mounted (line 32) | mounted() {
FILE: uni_modules/uni-popup/components/uni-popup/share.js
method created (line 2) | created() {
method customOpen (line 9) | customOpen() {
method customClose (line 12) | customClose() {
Condensed preview — 176 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,373K chars).
[
{
"path": ".gitignore",
"chars": 52,
"preview": ".hbuilderx\r\n.DS_Store\nnode_modules\n/dist\n/unpackage\n"
},
{
"path": "App.vue",
"chars": 4915,
"preview": "<script>\n\texport default {\n\t\tonLaunch: function(o) {\n\t\t\tconsole.log('App Launch', o);\n\n\t\t\tthis.$AppEntryController.getWe"
},
{
"path": "AppEntryController.js",
"chars": 3061,
"preview": "import Vue from \"vue\"\n\n/* \n * APP入口页面控制器\n * 中心思想:动态入口解决方案 描述见:http://ask.dcloud.net.cn/question/63270\n */\n\nclass AppEntr"
},
{
"path": "LICENSE",
"chars": 1063,
"preview": "MIT License\n\nCopyright (c) 2018 DCloud\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof "
},
{
"path": "README.md",
"chars": 2004,
"preview": "# 招聘小程序无忧直聘(前端)\n\n:star:一款基于[uni-app](https://zh.uniapp.dcloud.io/)编写的招聘求职类前端,该前端包含了大部分核心页面和逻辑交互。前端分了两种角色:求职者和招聘者,通过角色切换可"
},
{
"path": "apis/http.js",
"chars": 2214,
"preview": "import store from \"@/store\"\nfunction HTTP(obj, config) {\n\n\tlet defaultConfig = {\n\t\tisRes: false,\n\t\tloading: false\n\t}\n\n\tc"
},
{
"path": "apis/index.js",
"chars": 6420,
"preview": "import http from \"./http.js\";\nimport config from \"@/config/index.config.js\";\r\n\r\n// 获取OpenId\nexport const getOpenId = (da"
},
{
"path": "common/auth.js",
"chars": 358,
"preview": "function loginCheck(pageObj) {\n\tif (pageObj.onLoad) {\n\t\tlet _onLoad = pageObj.onLoad;\n\t\t// 使用onLoad的话需要传递options\n\t\tpageO"
},
{
"path": "common/cityData.js",
"chars": 16064,
"preview": "export default [{\n\t\"label\": \"福建省\",\n\t\"value\": \"3900\",\n\t\"children\": [{\n\t\t\"label\": \"三明市\",\n\t\t\"value\": \"3950\"\n\t}, {\n\t\t\"label\""
},
{
"path": "common/data.js",
"chars": 2978,
"preview": "// 数据格式,数据中只需要包含以下字段和数据格式,开发者可以添加字段,比如id等等,不影响组件显示,\r\n// 组件的返回结果是有菜单数组下标形式返回,\r\n// 如果传入数据中有value,也会返回value,开发者可根据返回的下标获取所选"
},
{
"path": "common/date.js",
"chars": 2000,
"preview": "// date.js\r\nexport function formatDate(date, fmt) {\r\n\tif (/(y+)/.test(fmt)) {\r\n\t\tfmt = fmt.replace(RegExp.$1, (date.getF"
},
{
"path": "common/db.js",
"chars": 636,
"preview": "\r\n//取值\r\nfunction get(key,sync = true) {\r\n try {\r\n\t\tif(sync){\r\n\t\t\treturn uni.getStorageSync(key);\r\n\t\t}else{\r\n\t\t\tlet da"
},
{
"path": "common/graceChecker.js",
"chars": 3329,
"preview": "/**\n数据验证(表单验证)\n来自 grace.hcoder.net \n作者 hcoder 深海\n*/\nmodule.exports = {\n\terror:'',\n\tcheck : function (data, rule){\n\t\tfor("
},
{
"path": "common/modalHelper.js",
"chars": 769,
"preview": "export default (function (bodyCls) {\n var scrollTop;\n return {\n open: function () {\n "
},
{
"path": "common/router.js",
"chars": 660,
"preview": "/* \n * 路由对象\n * 中心思想:需要路由鉴权,由于uni-app没有vue中的全局钩子函数,所以封装了Router对象。\n * 说明:应用中的路由跳转尽量使用该Router的方法,并配合config中的路由表对象进行跳转。\n * \n"
},
{
"path": "common/utils.js",
"chars": 2923,
"preview": "export default {\n\n\t/* \n\t * 将cityNo 转 cityName\n\t * cityData:原数据\n\t * cityNo:二级地区编码\n\t */\n\tgetCityName(cityData, cityNo) {\n\t"
},
{
"path": "components/GoEasyAudioPlayer/GoEasyAudioPlayer.vue",
"chars": 1760,
"preview": "<template>\n <div class=\"goeasy-audio-player\" @click=\"playAudio\">\n <div class=\"audio-facade\" :style=\"{width:Mat"
},
{
"path": "components/QS-tabs/QS-tabs.vue",
"chars": 12523,
"preview": "<template>\r\n\t<view class=\"QS-tabs\" :style=\"{\r\n\t'z-index': zIndex,\r\n\t'font-size': getFontSize + 'rpx',\r\n\t'background-colo"
},
{
"path": "components/m-ad/m-ad.vue",
"chars": 502,
"preview": "<template>\n\t<view class=\"ad-box\">\n\t\t<view class=\"ad\" v-for=\"(item,index) in list\" :key=\"index\">\n\t\t\t<image :src=\"item.src"
},
{
"path": "components/m-cc-btn/m-cc-btn.vue",
"chars": 1156,
"preview": "<template>\n\t<view class=\"cc-btn\" @tap=\"handleClick\">\n\t\t<view class=\"cc-btn__jia\"></view>\n\t\t<view class=\"cc-btn__txt\">\n\t\t"
},
{
"path": "components/m-cc-popup/m-cc-popup.vue",
"chars": 6923,
"preview": "<template>\n\t<view>\n\t\t<view :class=\"{'m-mask':true}\" @click=\"hide\" @touchmove.stop.prevent=\"moveHandle\" v-show=\"showPopup"
},
{
"path": "components/m-cell/m-cell.vue",
"chars": 2304,
"preview": "<template>\n\t<view class='m-cell' :class=\"{'bottom-line':bottomLine,'top-line':topLine}\" @click=\"click\">\n\t\t<slot name=\"ic"
},
{
"path": "components/m-codedialog/m-codedialog.vue",
"chars": 6791,
"preview": "<template>\n\t<view v-if=\"show\" class=\"codedialog\">\n\t\t<view class=\"mask\"></view>\n\t\t<view class=\"dialog-view\">\n\t\t\t<text cla"
},
{
"path": "components/m-company/m-company.vue",
"chars": 2333,
"preview": "<template>\r\n\t<view class=\"m-position\">\r\n\t\t<view class=\"item\" v-for=\"(item, index) in list\" :key=\"index\" @click=\"onClick("
},
{
"path": "components/m-empty-data/m-empty-data.vue",
"chars": 927,
"preview": "<template>\n\t<view class=\"m-empty-data\">\n\t\t<view>\n\t\t\t<view>\n\t\t\t\t<image :src=\"coverUrl\" mode=\"\"></image>\n\t\t\t</view>\n\t\t\t<te"
},
{
"path": "components/m-fail/m-fail.vue",
"chars": 1544,
"preview": "<template>\n\t<view class=\"fail-page\" v-if=\"status\">\n\t\t<view class=\"fail-page__icon\">\n\t\t\t<view>\n\t\t\t\t<image :src=\"fail_icon"
},
{
"path": "components/m-format-card/m-format-card.vue",
"chars": 499,
"preview": "<template>\n\t<text>{{value}}</text>\n</template>\n\n<script>\n\texport default {\n\t\tprops: {\n\t\t\tcardNo: {\n\t\t\t\ttype: [String,Num"
},
{
"path": "components/m-format-phone/m-format-phone.vue",
"chars": 414,
"preview": "<template>\n\t<text>{{value}}</text>\n</template>\n\n<script>\n\texport default {\n\t\tprops: {\n\t\t\tphone: {\n\t\t\t\ttype: String,\n\t\t\t\t"
},
{
"path": "components/m-icon/m-icon.css",
"chars": 4767,
"preview": "@font-face {\n\tfont-family: uniicons;\n\tfont-weight: normal;\n\tfont-style: normal;\n\tsrc: url('https://img-cdn-qiniu.dcloud."
},
{
"path": "components/m-icon/m-icon.vue",
"chars": 621,
"preview": "<template>\n\t<view class=\"m-icon\" :class=\"['icon-'+type]\" :style=\"{color:color,'font-size':fontSize}\" @click=\"onClick()\">"
},
{
"path": "components/m-input/m-input.vue",
"chars": 3517,
"preview": "<template>\n <view class=\"m-input-view\">\n <input :focus=\"focus_\" :type=\"inputType\" :value=\"value\" @input=\"onInp"
},
{
"path": "components/m-page-view/m-page-view.vue",
"chars": 28292,
"preview": "<template>\n\t<view class=\"m-page-view\">\n\t\t<view class=\"m-page-view__loading\" v-show=\"joyPageStatus == 'loading'\">\n\t\t\t<vie"
},
{
"path": "components/m-popup/m-popup.vue",
"chars": 4207,
"preview": "<template>\n\t<view>\n\t\t<view :class=\"{'m-mask':true}\" @click=\"hide\" @touchmove.stop.prevent=\"moveHandle\" v-show=\"showPopup"
},
{
"path": "components/m-popup-header/m-popup-header.vue",
"chars": 1292,
"preview": "<template>\n\t<view class=\"mpvue-picker__hd\" catchtouchmove=\"true\">\n\t\t<view class=\"mpvue-picker__action\" @click=\"clickCanc"
},
{
"path": "components/m-position/m-position.vue",
"chars": 4850,
"preview": "<template>\r\n\t<view class=\"m-position\">\r\n\t\t<view class=\"item\" v-for=\"(item, index) in positions\" :key=\"index\" @click=\"onC"
},
{
"path": "components/m-qrcode/m-qrcode.vue",
"chars": 2161,
"preview": "<template xlang=\"wxml\" minapp=\"mpvue\">\n\t<view class=\"_qrCode\">\n\t\t<canvas class=\"_qrCodeCanvas\" id=\"_myQrCodeCanvas\" canv"
},
{
"path": "components/m-qrcode/qrcode.js",
"chars": 41069,
"preview": "let QRCode = {};\n(function () {\n /**\n * 获取单个字符的utf8编码\n * unicode BMP平面约65535个字符\n * @param {num} code\n "
},
{
"path": "components/m-swiper/m-swiper.vue",
"chars": 1469,
"preview": "<template>\n\t<view class=\"swiper-box\">\n\t\t<swiper class=\"swiper\" :indicator-dots=\"true\" :autoplay=\"true\" :interval=\"3000\" "
},
{
"path": "components/m-textarea/m-textarea.vue",
"chars": 905,
"preview": "<template>\n\t<view class=\"r-top\">\r\n\t\t<textarea :maxlength=\"len\" placeholder-style=\"color:rgba(153,153,153,1);\" v-model=\"c"
},
{
"path": "components/m-upimg/m-upimg.1.vue",
"chars": 62528,
"preview": "<!-- \n \n方法upImgData可获取上传图片的所有信息,为数组(可以通过此来计算图片长度以及其它信息)\n \n/**\n * <sunsin-upimg url=\"https://j.dns06.net.cn/index.php?m=A"
},
{
"path": "components/m-upimg/m-upimg.vue",
"chars": 3590,
"preview": "<template>\n\t<view class=\"upload-box\">\n\t\t<view class=\"upload\" v-if=\"previewImageUrl\">\n\t\t\t<image class=\"cover\" :src=\"previ"
},
{
"path": "components/mpvue-citypicker/city-data/area.js",
"chars": 206837,
"preview": "/* eslint-disable */\nvar areaData = [\n [\n [{\n \"label\": \"东城区\",\n \"value\": \"110101\"\n },\n {\n "
},
{
"path": "components/mpvue-citypicker/city-data/city.js",
"chars": 21280,
"preview": "/* eslint-disable */\nvar cityData = [\n [{\n \"label\": \"市辖区\",\n \"value\": \"1101\"\n }],\n [{\n \"label\": \"市辖区\",\n \"v"
},
{
"path": "components/mpvue-citypicker/city-data/province.js",
"chars": 1683,
"preview": "/* eslint-disable */\nvar provinceData = [{\n \"label\": \"北京市\",\n \"value\": \"11\"\n },\n {\n \"label\": \"天津市\",\n \"value"
},
{
"path": "components/mpvue-citypicker/mpvueCityPicker.vue",
"chars": 5611,
"preview": "<template>\n <div class=\"mpvue-picker\">\n <div :class=\"{'pickerMask':showPicker}\" @click=\"maskClick\" catchtouchmove=\"t"
},
{
"path": "components/mpvue-picker/mpvue-picker.vue",
"chars": 20268,
"preview": "<template>\n <view class=\"mpvue-picker\">\n <view :class=\"{'pickerMask':showPicker}\" @click=\"maskClick\" catchtouc"
},
{
"path": "components/sunui-grand/sunui-grand.vue",
"chars": 2307,
"preview": "<template name='sunui-grand'>\r\n\t<view>\r\n\t\t<view v-show=\"isHide\">\r\n\t\t\t<view class=\"sunui-grand-hide-bg\" :style=\"'backgrou"
},
{
"path": "components/uni-load-more/readme.md",
"chars": 751,
"preview": "### LoadMore 加载更多\n\n用于列表中,做滚动加载使用,展示 loading 的各种状态,组件名:``uni-load-more``,代码块: uLoadMore。\n\n**使用方式:**\n\n在 ``script`` 中引用组件 \n"
},
{
"path": "components/uni-load-more/uni-load-more.vue",
"chars": 3121,
"preview": "<template>\n\t<view class=\"uni-load-more\" @tap=\"$emit('click')\">\n\t\t<view class=\"uni-load-more__img\" v-show=\"showIcon\">\n\t\t\t"
},
{
"path": "components/uni-popup1/uni-popup.vue",
"chars": 1478,
"preview": "<template>\n\t<view>\n\t\t<view class=\"uni-mask\" v-show=\"show\" :style=\"{top:offsetTop + 'px'}\" @click=\"hide\"></view>\n\t\t<view "
},
{
"path": "components/yzb/yzb-about.vue",
"chars": 1241,
"preview": "<template>\r\n\t<!-- 关于我们 -->\r\n\t<view class=\"aboutus-bg\">\r\n\t\t<!-- Logo -->\r\n\t\t<image class=\"img-head\" src=\"/static/img/logo"
},
{
"path": "components/yzb/yzb-apply.vue",
"chars": 9024,
"preview": "<template>\r\n\t<view class=\"m-position\">\r\n\t\t<view class=\"item\" v-for=\"(item, index) in list\" :key=\"index\" @click=\"onClick("
},
{
"path": "components/yzb/yzb-browse.vue",
"chars": 7904,
"preview": "<template>\r\n\t<view class=\"m-position\">\r\n\t\t<view class=\"item\" v-for=\"(item, index) in list\" :key=\"index\" @click=\"onClick("
},
{
"path": "components/yzb/yzb-classification.vue",
"chars": 4279,
"preview": "<template>\n\t<view class=\"classification\">\n\t\t<view class=\"left\">\r\n\t\t\t<scroll-view class=\"leftScroll\" style=\"height: 100vh"
},
{
"path": "components/yzb/yzb-connected.vue",
"chars": 8623,
"preview": "<template>\r\n\t<view class=\"m-position\">\r\n\t\t<view class=\"item\" v-for=\"(item, index) in list\" :key=\"index\" @click=\"onClick("
},
{
"path": "components/yzb/yzb-filterDropdown.vue",
"chars": 24176,
"preview": "<template>\r\n\t<view class=\"HMfilterDropdown\" :class=\"{'setDropdownBottom':maskVisibility}\" :style=\"{'top':menuTop+'rpx'}\""
},
{
"path": "components/yzb/yzb-grid.vue",
"chars": 4610,
"preview": "<template>\n\t<view class=\"uni-grid\" :class=\"setBorderClass\">\n\t\t<view class=\"uni-grid__flex\" v-if=\"gridGroup.length>0\" v-f"
},
{
"path": "components/yzb/yzb-notice.vue",
"chars": 1186,
"preview": "<template>\r\n\t<view class=\"content\">\r\n\t\t<view class=\"title\">\r\n\t\t\t<text>系统通知</text>\r\n\t\t</view>\r\n\t\t<view class=\"date\">\r\n\t\t\t"
},
{
"path": "components/yzb/yzb-resume.vue",
"chars": 3506,
"preview": "<template>\r\n\t<view class=\"m-position\">\r\n\t\t<view class=\"item\" v-for=\"(item, index) in list\" :key=\"index\" @click=\"onClick("
},
{
"path": "config/assets.config.js",
"chars": 1693,
"preview": "import indexConfig from \"./index.config.js\"\n\nconst PATH = indexConfig.assetsPath;\n\n/* \n * 图片静态资源表,所有图片资源路径在这统一管理,不应该写死在页"
},
{
"path": "config/constData.config.js",
"chars": 105,
"preview": "export default {\n\t\n\t// 商户审核状态字典\n\tstatus: {\n\t\tSUCCESS: \"审核通过\",\n\t\tWAIT_AUDIT: \"审核中\",\n\t\tREJECT: \"审核拒绝\"\n\t}\n}\n"
},
{
"path": "config/formRule.config.js",
"chars": 3723,
"preview": "/* \n * 应用表单校验相关配置\n * 依赖:graceChecker.js 进行校验\n * \n * 使用:引入该js到页面,let res = graceChecker.check({phoneNo:\"\",code:\"\"},formRu"
},
{
"path": "config/index.config.js",
"chars": 1261,
"preview": "const CONFIG = {\n //开发环境配置\n development: {\n loginTitleTxt: \"欢迎使用人才直聘\", // 登录页标题\n "
},
{
"path": "config/routes.config.js",
"chars": 3747,
"preview": "/* \n * 路由表对象:\n * 该文件挂载在Vue原型中 $mRoutesConfig\n * 作用:调用$mRouter对象的方法 传入以下对应的路由对象,详细见common目录下的router.js\n * 示例:this.$mRoute"
},
{
"path": "lib/EmojiDecoder.js",
"chars": 871,
"preview": "/*\r\n* @Author: jack.lu\r\n* @Date: 2020/9/11\r\n* @Last Modified by: jack.lu\r\n* @Last Modified time: 2020/9/11 4:35 下午\r\n*/\r\n"
},
{
"path": "lib/imservice.js",
"chars": 4064,
"preview": "import restApi from './restapi';\r\n\r\nfunction Friend(_id, username, avatar) {\r\n\tthis._id = _id;\r\n\tthis.name = username;\r\n"
},
{
"path": "lib/restapi.js",
"chars": 2809,
"preview": "//用户数据示例\r\nlet users = [\r\n {\r\n \"id\": \"08c0a6ec\",\r\n \"username\": \"Mattie\",\r\n \"password\": \"123\",\r\n "
},
{
"path": "main.js",
"chars": 2751,
"preview": "import Vue from 'vue'\nimport App from './App'\nimport store from './store'\nimport * as Db from './common/db.js'\nimport $A"
},
{
"path": "manifest.json",
"chars": 3318,
"preview": "{\n \"name\" : \"wuyou-frontend\",\n \"appid\" : \"__UNI__C1A0619\",\n \"description\" : \"\",\n \"versionName\" : \"1.0.0\",\n "
},
{
"path": "pages/chat/chat.vue",
"chars": 8682,
"preview": "<template>\n\t<view class=\"content\">\n\t\t<view class=\"top\">\n\t\t\t<view class=\"bg\"></view>\n\t\t\t<view class=\"v-grid\" v-if=\"userIn"
},
{
"path": "pages/chat/notice/noticeDetail.vue",
"chars": 580,
"preview": "<template>\n\t<view>\n\t\t<yzb-notice :detail=\"data\" />\n\t\t<view v-if=\"loading\" class=\"loading\"><text>加载中...</text></view>\n\t</"
},
{
"path": "pages/chat/notice/notices.vue",
"chars": 2129,
"preview": "<template>\r\n\t<view class=\"content\" style=\"height: 100vh;\">\r\n\t\t<uni-list :border=\"true\">\r\n\t\t\t<view v-if=\"loading\" class=\""
},
{
"path": "pages/chat/privateChat.vue",
"chars": 24750,
"preview": "<template>\r\n\t<view class=\"chatInterface\">\r\n\t\t<uni-grid ref=\"grid\" v-if=\"userInfo.memberRole === 1\" class=\"grid\" :column="
},
{
"path": "pages/common/industry.vue",
"chars": 1331,
"preview": "<template>\r\n\t<view class=\"content\">\r\n\t\t<yzbClassification\r\n\t\t\tref=\"yzb\"\r\n\t\t\t:dataList=\"list\"\r\n\t\t\t:index=\"index\"\r\n\t\t\t:sel"
},
{
"path": "pages/common/post.vue",
"chars": 1609,
"preview": "<template>\r\n\t<view class=\"content\">\r\n\t\t<yzbClassification\r\n\t\t\tref=\"yzb\"\r\n\t\t\t:dataList=\"list\"\r\n\t\t\t:index=\"index\"\r\n\t\t\t:sel"
},
{
"path": "pages/company/detail.vue",
"chars": 7028,
"preview": "<template>\r\n\t<joy-page class=\"\">\r\n\t\t<view class=\"body\">\r\n\t\t\t<view class=\"top\">\r\n\t\t\t\t<view class=\"space-between\">\r\n\t\t\t\t\t<"
},
{
"path": "pages/company/list.vue",
"chars": 2081,
"preview": "<template>\r\n\t<joy-page class=\"\">\r\n\t\t<image class=\"top\" :src=\"bgImg\"></image>\r\n\t\t<view style=\"position: relative;\">\r\n\t\t\t<"
},
{
"path": "pages/company/resumeList.vue",
"chars": 1911,
"preview": "<template>\r\n\t<joy-page class=\"\">\r\n\t\t<image class=\"top\" :src=\"bgImg\"></image>\r\n\t\t<view style=\"position: relative;\">\r\n\t\t\t<"
},
{
"path": "pages/login/bindphone.vue",
"chars": 6417,
"preview": "<template>\r\n\t<form class='loginView' @submit=\"login\" :model=\"ReginForm\" ref=\"ReginForm\">\r\n\t\t<!-- <image class=\"login-bg\""
},
{
"path": "pages/login/index.vue",
"chars": 1660,
"preview": "<template>\n\t<view class=\"content reg-go\">\n\t\t<image class=\"logo\" :src=\"logo\" mode=\"\"></image>\n\t\t<image class=\"desc\" :src="
},
{
"path": "pages/login/login.vue",
"chars": 5391,
"preview": "<template>\r\n\t<view class=\"wx-auth\">\r\n\t\t<view class=\"wx-auth\" v-if=\"canIUse\">\r\n\t\t\t<view class=\"header\"><image src=\"../../"
},
{
"path": "pages/login/reg.vue",
"chars": 8363,
"preview": "<template>\n\t<view class=\"content pad-10 reg-page\">\n\t\t<view class=\"input-group\">\n\t\t\t<view class=\"input-row border-bottom-"
},
{
"path": "pages/login/success.vue",
"chars": 1087,
"preview": "<template>\n\t<view class=\"content success-page\">\n\t\t<view class=\"success-page__header\">\n\t\t\t<view class=\"success-page__icon"
},
{
"path": "pages/main/main.vue",
"chars": 9915,
"preview": "<template>\r\n\t<joy-page class=\"\">\r\n\t\t<view class=\"mp-search\">\r\n\t\t\t<view class=\"mp-search-input\" @click=\"search\">\r\n\t\t\t\t<te"
},
{
"path": "pages/main/search.vue",
"chars": 8960,
"preview": "<template>\r\n\t<view class=\"column \">\r\n\t\t<view class=\"search\">\r\n\t\t\t<view class=\"search-input\">\r\n\t\t\t\t<text class=\"yzb yzb-s"
},
{
"path": "pages/position/detail.vue",
"chars": 12770,
"preview": "<template>\r\n\t<joy-page class=\"\">\r\n\t\t<view class=\"body\">\r\n\t\t\t<view class=\"top\">\r\n\t\t\t\t<view class=\"space-between\">\r\n\t\t\t\t\t<"
},
{
"path": "pages/position/list.vue",
"chars": 2441,
"preview": "<template>\r\n\t<joy-page class=\"\">\r\n\t\t<!-- <view class=\"top\"> -->\r\n\t\t\t<image class=\"top\" :src=\"bgImg\"></image>\r\n\t\t<!-- </v"
},
{
"path": "pages/type/type.vue",
"chars": 6545,
"preview": "<template>\r\n\t<view>\r\n\t\t<yzbfilterDropdown\r\n\t\t\t:menuTop=\"0\"\r\n\t\t\t:filterData=\"filterData\"\r\n\t\t\t:defaultSelected=\"defaultSel"
},
{
"path": "pages/user/aboutUs.vue",
"chars": 571,
"preview": "<template>\r\n\t<view class=\"column bg-white with-100\">\r\n\t\t<yzb-about :data=\"data\"></yzb-about>\r\n\t</view>\r\n</template>\r\n\r\n<"
},
{
"path": "pages/user/apply.vue",
"chars": 3122,
"preview": "<template>\r\n\t<yzb-page :loadStatus=\"loadStatus\">\r\n\t\t<m-position v-if=\"list.length > 0 && query.type === 0\" :positions=\"l"
},
{
"path": "pages/user/browse.vue",
"chars": 2980,
"preview": "<template>\r\n\t<yzb-page :loadStatus=\"loadStatus\">\r\n\t\t<m-company v-if=\"list.length > 0 && query.type === 0\" :list=\"list\" "
},
{
"path": "pages/user/collect.vue",
"chars": 3008,
"preview": "<template>\r\n\t<yzb-page :loadStatus=\"loadStatus\">\r\n\t\t<m-position v-if=\"list.length > 0 && query.type === 0\" :positions=\"l"
},
{
"path": "pages/user/company/auth.vue",
"chars": 9396,
"preview": "<template>\n\t<view class=\"content reg-page\">\n\t\t<view class=\"input-group\">\n\t\t\t<view class=\"result-dairenzheng\" v-if=\"compa"
},
{
"path": "pages/user/company/company.vue",
"chars": 19157,
"preview": "<template>\r\n\t<view class=\"content reg-page\">\r\n\t\t<view class=\"input-group\">\r\n\t\t\t<view class=\"input-column border-bottom-1"
},
{
"path": "pages/user/company/enter.vue",
"chars": 7081,
"preview": "<template>\r\n\t<view class=\"content reg-page\">\r\n\t\t<view class=\"input-group\">\r\n\t\t\t<view class=\"input-row border-bottom-1px\""
},
{
"path": "pages/user/company/position-edit.vue",
"chars": 10066,
"preview": "<template>\r\n\t<view class=\"content reg-page\">\r\n\t\t<view class=\"input-group\">\r\n\t\t\t<view class=\"input-column border-bottom-1"
},
{
"path": "pages/user/company/positions.vue",
"chars": 8314,
"preview": "<template>\r\n\t<view class=\"content\">\r\n<!-- \t\t<view class=\"QS-tabs-box\">\r\n\t\t\t<QSTabs\r\n\t\t\t\tref=\"tabs\"\r\n\t\t\t\t:tabs=\"tabs\"\r\n\t\t"
},
{
"path": "pages/user/connected.vue",
"chars": 2442,
"preview": "<template>\r\n\t<yzb-page :loadStatus=\"loadStatus\">\r\n\t\t<m-empty-data v-if=\"list.length === 0\" :coverUrl=\"no_order_1\" noTxt="
},
{
"path": "pages/user/contactUs.vue",
"chars": 3773,
"preview": "<template>\r\n\t<view class=\"column with-100\">\r\n\t\t<view class=\"bg-white column padding-height-20 margin-bottom-20\">\r\n\t\t\t<vi"
},
{
"path": "pages/user/help.vue",
"chars": 1612,
"preview": "<template>\r\n\t<view class=\"help-bg\">\r\n\t\t<view class=\"help-item\" v-for=\"(item, index) in list\" :key=\"index\" @click=\"navTo("
},
{
"path": "pages/user/helpcenterDetails.vue",
"chars": 939,
"preview": "<template>\r\n\t<view>\r\n\t\t<view class=\"helpcenterList\">\r\n\t\t\t<view class=\"mb10\">{{ list.title }}</view>\r\n\t\t\t<view class=\"wit"
},
{
"path": "pages/user/hideSetting.vue",
"chars": 3855,
"preview": "<template>\r\n\t<yzb-page :loadStatus=\"loadStatus\">\r\n\t\t<view class=\"title\" v-if=\"query.type==0\">已屏蔽{{count}}家公司</view>\r\n\t\t<"
},
{
"path": "pages/user/person/edit-edu.vue",
"chars": 7741,
"preview": "<template>\r\n\t<view class=\"content reg-page\">\r\n\t\t<view class=\"input-group\">\r\n\t\t\t<view class=\"input-column border-bottom-1"
},
{
"path": "pages/user/person/edit-expect.vue",
"chars": 7520,
"preview": "<template>\r\n\t<view class=\"content reg-page\">\r\n\t\t<view class=\"input-group\">\r\n\t\t\t<view class=\"input-row border-bottom-1px\""
},
{
"path": "pages/user/person/edit-pro-content.vue",
"chars": 3500,
"preview": "<template>\r\n\t<view class=\"content reg-page\">\r\n\t\t<view class=\"column padding-20\">\r\n\t\t\t<text class=\"title\">{{title}}</text"
},
{
"path": "pages/user/person/edit-pro.vue",
"chars": 7597,
"preview": "<template>\n\t<view class=\"content reg-page\">\n\t\t<view class=\"input-group\">\n\t\t\t<view class=\"input-column border-bottom-1px\""
},
{
"path": "pages/user/person/edit-skill.vue",
"chars": 2342,
"preview": "<template>\r\n\t<view class=\"content reg-page\">\r\n\t\t<view class=\"column\">\r\n\t\t\t<text class=\"title\">我的优势</text>\r\n\t\t\t<text clas"
},
{
"path": "pages/user/person/edit-work-content.vue",
"chars": 2749,
"preview": "<template>\r\n\t<view class=\"content reg-page\">\r\n\t\t<view class=\"column padding-20\">\r\n\t\t\t<!-- <text class=\"title\"></text> --"
},
{
"path": "pages/user/person/edit-work.vue",
"chars": 11485,
"preview": "<template>\n\t<view class=\"content reg-page\">\n\t\t<view class=\"input-group\">\n\t\t\t<view class=\"input-column border-bottom-1px\""
},
{
"path": "pages/user/person/resume.vue",
"chars": 6389,
"preview": "<template>\r\n\t<view class=\"content\">\r\n\t\t<view class=\"base-info space-between-algin bottom-line padding-height-20\" @click="
},
{
"path": "pages/user/person/resumeDetail.vue",
"chars": 6269,
"preview": "<template>\n\t<view class=\"content\">\n\t\t<view class=\"base-info space-between-algin bottom-line padding-height-20\">\n\t\t\t<view"
},
{
"path": "pages/user/privacy.vue",
"chars": 571,
"preview": "<template>\r\n\t<view class=\"column bg-white with-100\">\r\n\t\t<yzb-about :data=\"data\"></yzb-about>\r\n\t</view>\r\n</template>\r\n\r\n<"
},
{
"path": "pages/user/promoCode.vue",
"chars": 2389,
"preview": "<template>\n\t<view class=\"content promo-page\">\n\t\t<view class=\"code-box\">\n\t\t\t<view class=\"head-img\">\n\t\t\t\t<image :src=\"user"
},
{
"path": "pages/user/robot.vue",
"chars": 14151,
"preview": "<template>\r\n\t<view>\r\n\t\t<!-- 空盒子用来防止消息过少时 拉起键盘会遮盖消息 -->\r\n\t\t<view :animation=\"anData\" style=\"height:0;\"></view>\r\n\t\t<!-- 消息"
},
{
"path": "pages/user/settings.vue",
"chars": 3437,
"preview": "<template>\n\t<view class=\"content with-100\">\n\t\t<view class=\"list\" v-for=\"(list, list_i) in severList2\" :key=\"list_i\">\n\t\t\t"
},
{
"path": "pages/user/terms.vue",
"chars": 571,
"preview": "<template>\r\n\t<view class=\"column bg-white with-100\">\r\n\t\t<yzb-about :data=\"data\"></yzb-about>\r\n\t</view>\r\n</template>\r\n\r\n<"
},
{
"path": "pages/user/user.vue",
"chars": 10471,
"preview": "<template>\r\n\t<view>\r\n\t\t<view class=\"header\">\r\n\t\t\t<view class=\"userinfo\" @click=\"toLogin\">\r\n\t\t\t\t<view class=\"face\"><image"
},
{
"path": "pages/user/userInfo.vue",
"chars": 6723,
"preview": "<template>\r\n\t<view class=\"content reg-page\">\r\n\t\t<view class=\"input-group\">\r\n\t\t\t<view class=\"input-column border-bottom-1"
},
{
"path": "pages.json",
"chars": 7048,
"preview": "{\r\n\t\"pages\": [{\r\n\t\t\t\"path\": \"pages/main/main\",\r\n\t\t\t\"style\": {\r\n\t\t\t\t// #ifdef H5\r\n\t\t\t\t\"navigationStyle\": \"custom\",\r\n\t\t\t\t/"
},
{
"path": "static/css/chatInterface.css",
"chars": 9096,
"preview": "\t.chatInterface{\r\n\t\tbackground-color: #f4f4f4;\r\n\t\theight: 100vh;\r\n\t}\r\n\t.chatInterface .scroll-view{\r\n\t\tpadding-left: 20r"
},
{
"path": "static/css/common.css",
"chars": 4547,
"preview": "/**\r\n * 内容区域\r\n */\r\n.content {\r\n\tflex: 1;\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tflex-direction: column;\r\n\talign-items: center;"
},
{
"path": "static/css/yzb-icon.css",
"chars": 7273,
"preview": "@font-face {\n font-family: \"yzb\"; /* Project id 2404254 */\n src: url('//at.alicdn.com/t/font_2404254_pjbaptldvv.woff2?"
},
{
"path": "static/icomoon/selection.json",
"chars": 36823,
"preview": "{\"IcoMoonType\":\"selection\",\"icons\":[{\"icon\":{\"paths\":[\"M496 814.272l-249.152 131.008c-4.317 2.316-9.446 3.676-14.892 3.6"
},
{
"path": "static/icomoon/style.css",
"chars": 2285,
"preview": "@font-face {\n font-family: 'icomoon';\n src: url('~@/static/icomoon/fonts/icomoon.eot?vghjqo');\n src: url('~@/static"
},
{
"path": "store/index.js",
"chars": 1688,
"preview": "import Vue from 'vue'\nimport Vuex from 'vuex'\nimport $mConfig from '@/config/index.config.js'\nimport $mRoutesConfig from"
},
{
"path": "uni.scss",
"chars": 2500,
"preview": "// 主色调\r\n$main-color: #12ae85;\n\n/* 页面左右间距 */\n$page-row-spacing: 30upx;\n$page-color-base: #f8f8f8;\n$page-color-light: #f8f"
},
{
"path": "uni_modules/bctos-rich-text/changelog.md",
"chars": 257,
"preview": "## 1.0.5(2022-03-09)\n解决vue 子组件修改父组件传来的props值报错问题\n## 1.0.4(2022-03-03)\n重新赋值后加入强制刷新功能,解决动态内容渲染不出来的问题\n## 1.0.3(2022-02-25)\n"
},
{
"path": "uni_modules/bctos-rich-text/components/bctos-rich-text/bctos-rich-text.vue",
"chars": 1321,
"preview": "<template>\r\n\t<view>\r\n\t\t<view v-for=\"(content, index) in contentArr\" :key=\"index\">\r\n\t\t\t<rich-text :nodes=\"content\"></rich"
},
{
"path": "uni_modules/bctos-rich-text/package.json",
"chars": 1443,
"preview": "{\r\n\t\"id\": \"bctos-rich-text\",\r\n\t\"displayName\": \"带视频解析的富文本展示\",\r\n\t\"version\": \"1.0.5\",\r\n\t\"description\": \"从富文本内容中解析出视频和其它内容,然"
},
{
"path": "uni_modules/bctos-rich-text/readme.md",
"chars": 2279,
"preview": "# bctos-rich-text 带视频解析的富文本展示\r\n\r\n从富文本内容中解析出视频和其它内容,然后分别使用video和rich-text组件进行展示,视频还会在富文本中原来的位置中展示,不会打乱内容展示顺序,保证展示效果与后台编辑的"
},
{
"path": "uni_modules/uni-collapse/changelog.md",
"chars": 92,
"preview": "## 1.1.6(2021-02-05)\n- 优化 组件引用关系,通过uni_modules引用组件\n## 1.1.5(2021-02-05)\n- 调整为uni_modules目录规范"
},
{
"path": "uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue",
"chars": 1135,
"preview": "<template>\r\n\t<view class=\"uni-collapse\">\r\n\t\t<slot />\r\n\t</view>\r\n</template>\r\n<script>\n\t/**\n\t * Collapse 折叠面板\n\t * @descri"
},
{
"path": "uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue",
"chars": 5671,
"preview": "<template>\r\n\t<view :class=\"{ 'uni-collapse-cell--disabled': disabled,'uni-collapse-cell--notdisabled': !disabled, 'uni-c"
},
{
"path": "uni_modules/uni-collapse/package.json",
"chars": 1554,
"preview": "{\n \"id\": \"uni-collapse\",\n \"displayName\": \"Collapse 折叠面板\",\n \"version\": \"1.1.6\",\n \"description\": \" collapse uni-ui 折叠面"
},
{
"path": "uni_modules/uni-collapse/readme.md",
"chars": 3048,
"preview": "\n\n## Collapse 折叠面板\n> 代码块: `uCollapse`\n> 关联组件:`uni-collapse-item`、`uni-icons`。\n\n\n展示可以折叠 / 展开的内容区域。\n\n### 安装方式\n\n本组件符合[easyc"
},
{
"path": "uni_modules/uni-grid/changelog.md",
"chars": 536,
"preview": "## 1.4.0(2021-11-19)\n- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/c"
},
{
"path": "uni_modules/uni-grid/components/uni-grid/uni-grid.vue",
"chars": 2850,
"preview": "<template>\r\n\t<view class=\"uni-grid-wrap\">\r\n\t\t<view :id=\"elId\" ref=\"uni-grid\" class=\"uni-grid\" :class=\"{ 'uni-grid--borde"
},
{
"path": "uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue",
"chars": 2873,
"preview": "<template>\r\n\t<view v-if=\"width\" :style=\"'width:'+width+';'+(square?'height:'+width:'')\" class=\"uni-grid-item\">\r\n\t\t<view "
},
{
"path": "uni_modules/uni-grid/package.json",
"chars": 1706,
"preview": "{\r\n \"id\": \"uni-grid\",\r\n \"displayName\": \"uni-grid 宫格\",\r\n \"version\": \"1.4.0\",\r\n \"description\": \"Grid 宫格组件,提供移动端常见的宫格布局"
},
{
"path": "uni_modules/uni-grid/readme.md",
"chars": 179,
"preview": "\n\n## Grid 宫格\n> **组件名:uni-grid**\n> 代码块: `uGrid`\n\n\n宫格组件。\n\n### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-grid)\n##"
},
{
"path": "uni_modules/uni-icons/changelog.md",
"chars": 42,
"preview": "## 1.1.4(2021-02-05)\n- 调整为uni_modules目录规范\n"
},
{
"path": "uni_modules/uni-icons/components/uni-icons/icons.js",
"chars": 3338,
"preview": "export default {\r\n\t\"pulldown\": \"\\ue588\",\r\n\t\"refreshempty\": \"\\ue461\",\r\n\t\"back\": \"\\ue471\",\r\n\t\"forward\": \"\\ue470\",\r\n\t\"more\""
},
{
"path": "uni_modules/uni-icons/components/uni-icons/uni-icons.vue",
"chars": 36933,
"preview": "<template>\r\n\t<text :style=\"{ color: color, 'font-size': size + 'px' }\" class=\"uni-icons\" :class=\"[customIcons,customIcon"
},
{
"path": "uni_modules/uni-icons/package.json",
"chars": 1509,
"preview": "{\n \"id\": \"uni-icons\",\n \"displayName\": \"Icons 图标\",\n \"version\": \"1.1.4\",\n \"description\": \"图标组件,用于展示移动端常见的图标,可自定义颜色、大小。"
},
{
"path": "uni_modules/uni-icons/readme.md",
"chars": 722,
"preview": "\n\n## Icons 图标\n> 代码块: `uIcons`\n\n\n用于展示 icons 图标 。\n\n### 安装方式\n\n本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id="
},
{
"path": "uni_modules/uni-list/changelog.md",
"chars": 679,
"preview": "## 1.2.0(2021-11-23)\n- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/c"
},
{
"path": "uni_modules/uni-list/components/uni-list/uni-list - ╕▒▒╛.vue",
"chars": 2081,
"preview": "<template>\r\n\t<!-- #ifndef APP-NVUE -->\r\n\t<view class=\"uni-list uni-border-top-bottom\">\r\n\t\t<view v-if=\"border\" class=\"uni"
},
{
"path": "uni_modules/uni-list/components/uni-list/uni-list.vue",
"chars": 2130,
"preview": "<template>\r\n\t<!-- #ifndef APP-NVUE -->\r\n\t<view class=\"uni-list uni-border-top-bottom\">\r\n\t\t<view v-if=\"border\" class=\"uni"
},
{
"path": "uni_modules/uni-list/components/uni-list/uni-refresh.vue",
"chars": 1617,
"preview": "<template>\r\n <!-- #ifdef APP-NVUE -->\r\n <refresh :display=\"display\" @refresh=\"onrefresh\" @pullingdown=\"onpullingdo"
},
{
"path": "uni_modules/uni-list/components/uni-list/uni-refresh.wxs",
"chars": 2280,
"preview": "var pullDown = {\r\n threshold: 95,\r\n maxHeight: 200,\r\n callRefresh: 'onrefresh',\r\n callPullingDown: 'onpullin"
},
{
"path": "uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue",
"chars": 2224,
"preview": "<template>\r\n\t<!-- #ifdef APP-NVUE -->\r\n\t<cell>\r\n\t\t<!-- #endif -->\r\n\t\t<view class=\"uni-list-ad\">\r\n\t\t\t<view v-if=\"borderSh"
},
{
"path": "uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss",
"chars": 998,
"preview": "/**\n * 这里是 uni-list 组件内置的常用样式变量\n * 如果需要覆盖样式,这里提供了基本的组件样式变量,您可以尝试修改这里的变量,去完成样式替换,而不用去修改源码\n *\n */\n\n// 背景色\n$background-colo"
},
{
"path": "uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue",
"chars": 13085,
"preview": "<template>\r\n\t<!-- #ifdef APP-NVUE -->\r\n\t<cell>\r\n\t\t<!-- #endif -->\r\n\t\t<view :hover-class=\"!clickable && !link ? '' : 'uni"
},
{
"path": "uni_modules/uni-list/components/uni-list-item/uni-list-item.vue",
"chars": 11055,
"preview": "<template>\r\n\t<!-- #ifdef APP-NVUE -->\r\n\t<cell>\r\n\t\t<!-- #endif -->\r\n\r\n\t\t<view :class=\"{ 'uni-list-item--disabled': disabl"
},
{
"path": "uni_modules/uni-list/package.json",
"chars": 1739,
"preview": "{\r\n \"id\": \"uni-list\",\r\n \"displayName\": \"uni-list 列表\",\r\n \"version\": \"1.2.0\",\r\n \"description\": \"List 组件 ,帮助使用者快速构建列表。\""
},
{
"path": "uni_modules/uni-list/readme.md",
"chars": 11199,
"preview": "\r\n\r\n## List 列表\r\n> **组件名:uni-list**\r\n> 代码块: `uList`、`uListItem`\r\n> 关联组件:`uni-list-item`、`uni-badge`、`uni-icons`、`uni-list"
},
{
"path": "uni_modules/uni-popup/changelog.md",
"chars": 200,
"preview": "## 1.2.9(2021-02-05)\n- 优化 组件引用关系,通过uni_modules引用组件\n## 1.2.8(2021-02-05)\n- 调整为uni_modules目录规范\n## 1.2.7(2021-02-05)\n- 调整为u"
},
{
"path": "uni_modules/uni-popup/components/uni-popup/keypress.js",
"chars": 1088,
"preview": "// #ifdef H5\nexport default {\n name: 'Keypress',\n props: {\n disable: {\n type: Boolean,\n default: false\n "
},
{
"path": "uni_modules/uni-popup/components/uni-popup/message.js",
"chars": 348,
"preview": "export default {\r\n\tcreated() {\n\t\tif (this.type === 'message') {\r\n\t\t\t// 不显示遮罩\r\n\t\t\tthis.maskShow = false \r\n\t\t\t// 获取子组件对象\r\n"
},
{
"path": "uni_modules/uni-popup/components/uni-popup/popup.js",
"chars": 914,
"preview": "import message from './message.js';\r\n// 定义 type 类型:弹出类型:top/bottom/center\r\nconst config = {\r\n\t// 顶部弹出\r\n\ttop: 'top',\r\n\t//"
},
{
"path": "uni_modules/uni-popup/components/uni-popup/share.js",
"chars": 236,
"preview": "export default {\r\n\tcreated() {\n\t\tif (this.type === 'share') {\r\n\t\t\t// 关闭点击\r\n\t\t\tthis.mkclick = false\r\n\t\t}\r\n\t},\r\n\tmethods: "
},
{
"path": "uni_modules/uni-popup/components/uni-popup/uni-popup.vue",
"chars": 6334,
"preview": "<template>\r\n\t<view v-if=\"showPopup\" class=\"uni-popup\" :class=\"[popupstyle, isDesktop ? 'fixforpc-z-index' : '']\"\r\n\t @tou"
},
{
"path": "uni_modules/uni-popup/components/uni-popup-dialog/keypress.js",
"chars": 1088,
"preview": "// #ifdef H5\nexport default {\n name: 'Keypress',\n props: {\n disable: {\n type: Boolean,\n default: false\n "
},
{
"path": "uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue",
"chars": 5570,
"preview": "<template>\r\n\t<view class=\"uni-popup-dialog\">\r\n\t\t<view class=\"uni-dialog-title\">\r\n\t\t\t<text class=\"uni-dialog-title-text\" "
},
{
"path": "uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue",
"chars": 2521,
"preview": "<template>\r\n\t<view class=\"uni-popup-message\">\r\n\t\t<view class=\"uni-popup-message__box fixforpc-width\" :class=\"'uni-popup_"
},
{
"path": "uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue",
"chars": 3417,
"preview": "<template>\r\n\t<view class=\"uni-popup-share\">\r\n\t\t<view class=\"uni-share-title\"><text class=\"uni-share-title-text\">{{title}"
},
{
"path": "uni_modules/uni-popup/package.json",
"chars": 1543,
"preview": "{\n \"id\": \"uni-popup\",\n \"displayName\": \"PopUp 弹出层\",\n \"version\": \"1.2.9\",\n \"description\": \" Popup 组件,提供常用的弹层\",\n \"keyw"
},
{
"path": "uni_modules/uni-popup/readme.md",
"chars": 6600,
"preview": "\n\n## Popup 弹出层\n> 代码块: `uPopup`\n> 关联组件:`uni-transition`,`uni-popup-dialog`,`uni-popup-message`,`uni-popup-share`\n\n\n弹出层组件,"
},
{
"path": "uni_modules/uni-section/changelog.md",
"chars": 0,
"preview": ""
},
{
"path": "uni_modules/uni-section/components/uni-section/uni-section.vue",
"chars": 2765,
"preview": "<template>\r\n\t<view class=\"uni-section\" nvue>\r\n\t\t<view v-if=\"type\" class=\"uni-section__head\">\r\n\t\t\t<view :class=\"type\" cla"
},
{
"path": "uni_modules/uni-section/package.json",
"chars": 1457,
"preview": "{\n \"id\": \"uni-section\",\n \"displayName\": \"Section 标题栏\",\n \"version\": \"0.0.1\",\n \"description\": \"\",\n \"keywords\": [\n "
},
{
"path": "uni_modules/uni-section/readme.md",
"chars": 778,
"preview": "\n\n## Section 标题栏\n> 代码块: `uSection`\n\n\n标题栏,用于显示标题。\n\n### 安装方式\n\n本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id"
},
{
"path": "uni_modules/uni-transition/changelog.md",
"chars": 42,
"preview": "## 1.0.2(2021-02-05)\n- 调整为uni_modules目录规范\n"
},
{
"path": "uni_modules/uni-transition/components/uni-transition/uni-transition.vue",
"chars": 5895,
"preview": "<template>\r\n\t<view v-if=\"isShow\" ref=\"ani\" class=\"uni-transition\" :class=\"[ani.in]\" :style=\"'transform:' +transform+';'+"
},
{
"path": "uni_modules/uni-transition/package.json",
"chars": 1517,
"preview": "{\n \"id\": \"uni-transition\",\n \"displayName\": \"Transition 过渡动画\",\n \"version\": \"1.0.2\",\n \"description\": \"元素的简单过渡动画\",\n \"k"
},
{
"path": "uni_modules/uni-transition/readme.md",
"chars": 1655,
"preview": "\n\n## Transition 过渡动画\n> 代码块: `uTransition`\n\n\n元素的简单过渡动画,组件名:`uni-transition`\n\n### 安装方式\n\n本组件符合[easycom](https://uniapp.dclo"
}
]
About this extraction
This page contains the full source code of the zhang2657977442/wuyou-frontend GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 176 files (1.1 MB), approximately 411.1k tokens, and a symbol index with 71 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.