diff --git a/.gitignore b/.gitignore
index 462131d..b4b341a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,3 +40,6 @@ nacl_irt_x86_64.nexe
nwjc.exe
payload.exe
+/uniCloud-aliyun/
+/unpackage/
+/.idea/
diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json
new file mode 100644
index 0000000..8911e10
--- /dev/null
+++ b/.hbuilderx/launch.json
@@ -0,0 +1,15 @@
+{
+ "version" : "1.0",
+ "configurations" : [
+ {
+ "default" : {
+ "launchtype" : "local"
+ },
+ "h5" : {
+ "launchtype" : "local"
+ },
+ "provider" : "aliyun",
+ "type" : "uniCloud"
+ }
+ ]
+}
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..d1d8fb7
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,101 @@
+
+
+
\ No newline at end of file
diff --git a/androidPrivacy.json b/androidPrivacy.json
new file mode 100644
index 0000000..375f993
--- /dev/null
+++ b/androidPrivacy.json
@@ -0,0 +1,38 @@
+{
+ "version": "1",
+ "prompt": "template",
+ "title": "服务协议和隐私政策",
+ "message": " 请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。
你可阅读《服务协议》和《隐私政策》了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
+ "buttonAccept": "同意并接受",
+ "buttonRefuse": "暂不同意",
+ "hrefLoader": "system",
+ "backToExit": "false",
+ "second": {
+ "title": "确认提示",
+ "message": " 进入应用前,你需先同意《服务协议》和《隐私政策》,否则将退出应用。",
+ "buttonAccept": "同意并继续",
+ "buttonRefuse": "退出应用"
+ },
+ "disagreeMode": {
+ "support": true,
+ "loadNativePlugins": false,
+ "visitorEntry": false,
+ "showAlways": false
+ },
+ "styles": {
+ "backgroundColor": "#ffffff",
+ "borderRadius": "5px",
+ "title": {
+ "color": "#000000"
+ },
+ "buttonAccept": {
+ "color": "#0a5fff"
+ },
+ "buttonRefuse": {
+ "color": "#7b7b81"
+ },
+ "buttonVisitor": {
+ "color": "#000000"
+ }
+ }
+}
\ No newline at end of file
diff --git a/apis/ctms/_utils/auth.js b/apis/ctms/_utils/auth.js
new file mode 100644
index 0000000..ca18c18
--- /dev/null
+++ b/apis/ctms/_utils/auth.js
@@ -0,0 +1,13 @@
+const TokenKey = 'CTMS-CLIENT-Token'
+
+export function getToken() {
+ return uni.getStorageSync(TokenKey)
+}
+
+export function setToken(token) {
+ return uni.setStorageSync(TokenKey, token)
+}
+
+export function removeToken() {
+ return uni.removeStorageSync(TokenKey)
+}
\ No newline at end of file
diff --git a/apis/ctms/_utils/constant.js b/apis/ctms/_utils/constant.js
new file mode 100644
index 0000000..e568d39
--- /dev/null
+++ b/apis/ctms/_utils/constant.js
@@ -0,0 +1,55 @@
+//缓存变量的键名
+const constant = {
+ storageKey: 'ctmsClientStore', //缓存键名,必须有
+ user: 'userinfo', //用户信息
+
+ orderBookForm: {
+ 'prefix': 'OrderBookDraft'
+ }, //运单询价草稿
+ orderBookSearch: "OrderBookSearch", //询价订单查询表单
+ orderBookList: {
+ 'prefix': "OrderBookList"
+ }, //询价缓存,
+ orderBookDetail: {
+ 'prefix': "OrderBookDetail"
+ }, //询价单详情,拼接oid订单ID参数
+
+ orderCreateForm: {
+ 'prefix': 'OrderCreateDraft'
+ }, //运单创建草稿
+ orderSearchS: 'OrderSearchSimple', //简单运单查询表单
+ orderSearchA: "OrderSearchAll", //完整运单查询表单
+ orderList: {
+ 'prefix': "OrderList"
+ }, //运单缓存,根据页面情况拼接参数;重新查询时应及时更新
+ orderDetail: {
+ 'prefix': "OrderDetail"
+ }, //运单详情,拼接oid订单ID参数
+ orderCheck: {
+ 'prefix': "OrderCheckInfo"
+ }, //运单详情,拼接oid订单ID参数
+
+ noticeList: {
+ 'prefix': "NoticeList"
+ },
+ noticeDetail: {
+ 'prefix': "NoticeDetail"
+ },
+
+ newsList: {
+ 'prefix': "NewsList"
+ },
+ newsDetail: {
+ 'prefix': "NewsDetail"
+ },
+ newsReading: "NewsReading",
+ newsLiked: "NewsLiked",
+ newsViewed: "NewsViewed",
+
+ userLoginForm: "fansLoginForm",
+ userRegForm: "fansRegForm",
+
+ splashShowed: "splashShowed" //已显示过开屏页
+}
+
+export default constant
\ No newline at end of file
diff --git a/apis/ctms/_utils/errorCode.json b/apis/ctms/_utils/errorCode.json
new file mode 100644
index 0000000..c7af02d
--- /dev/null
+++ b/apis/ctms/_utils/errorCode.json
@@ -0,0 +1,10 @@
+{
+ "0": "没有符合条件的数据",
+ "100": "",
+ "101": "",
+ "401": "认证失败,无法访问系统资源",
+ "403": "当前操作没有权限",
+ "404": "访问资源不存在",
+ "500": "网络服务出错",
+ "default": "系统未知错误,请反馈给管理员"
+}
\ No newline at end of file
diff --git a/apis/ctms/_utils/request.js b/apis/ctms/_utils/request.js
new file mode 100644
index 0000000..af6172e
--- /dev/null
+++ b/apis/ctms/_utils/request.js
@@ -0,0 +1,113 @@
+import store from '@/store'
+import config from '@/config/ctms.config.js'
+import {
+ getToken
+} from './auth.js'
+import errorCode from './errorCode.json'
+
+import utils from '@/utils/common.js'
+const tansParams = utils.tansParams;
+
+const timeout = 10000
+const loginPage = config.loginPage
+const request = function(param) {
+ utils.debug(param);
+
+ //url每次request请求都需要重新组织
+ let url = config.apiUrl;
+ url = url + config.url_entry + param.url + '.' + config.url_suffix;
+ if (param.force_url) {
+ url = param.force_url;
+ }
+ // get请求映射params参数
+ if (param.params) {
+ url = url + '?' + tansParams(param.params)
+ url = url.slice(0, -1)
+ }
+ // 是否需要设置 token
+ const isToken = (param.headers || {}).isToken === false
+ config.header = param.headers || {} //TODO,未成功使用
+ if (getToken() && !isToken) {
+ config.header['Authorization'] = 'hi-ctms-client ' + getToken()
+ }
+
+ let postdata = param.data || {};
+ postdata.pid = config.pid || 0;
+
+ var user = store.state.user;
+ postdata.uid = user.info.id || 0;
+
+ return new Promise((resolve, reject) => {
+ uni.request({
+ method: param.method || 'GET',
+ timeout: param.timeout || timeout,
+ url: url,
+ data: postdata,
+ header: config.header,
+ dataType: param.dataType || 'json',
+ success: function(res) {
+ // utils.debug(res);
+ if (res.statusCode === 200) {
+ //请求成功
+ const code = res.data.code || 0
+ //只有0,200这两种状态码可以返回数据,以便下一步操作;其他状态码无法进入到下一步
+ const msg = res.data.msg || errorCode[code] || errorCode['default']
+ switch (code) {
+ default:
+ resolve(false);
+ if (getApp().globalData.config.isDebug) {
+ reject(msg) //调试台显示错误提示
+ }
+ break;
+ case 401:
+ utils.showConfirm('登录状态已过期,您可以继续留在该页面,或者重新登录').then(res => {
+ if (res.confirm) {
+ store.dispatch('LogOut').then(res => {
+ uni.reLaunch({
+ url: loginPage
+ })
+ })
+ }
+ })
+ reject('无效的会话,或者会话已过期,请重新登录。')
+ break;
+ case 100:
+ case 101:
+ resolve(false);
+ uni.showToast({
+ title: msg,
+ icon: "error"
+ });
+ break;
+ case 0:
+ case 200:
+ resolve(res.data) //返回的只是数据
+ break;
+ }
+
+ } else if (res.statusCode === 500) {
+ reject('500')
+ } else {
+ reject(res.statusCode)
+ }
+ },
+ fail: (error) => {
+ let {
+ errMsg
+ } = error, message = ""
+ if (errMsg == 'request:fail') {
+ message = '云端连接异常'
+ } else if (errMsg == 'Network Error') {
+ message = '后端接口连接异常'
+ } else if (errMsg.includes('timeout')) {
+ message = '系统接口请求超时'
+ } else if (errMsg.includes('Request failed with status code')) {
+ message = '系统接口' + message.substr(message.length - 3) + '异常'
+ }
+ reject(message)
+ }
+ })
+ })
+}
+
+export default request
\ No newline at end of file
diff --git a/apis/ctms/_utils/storage.js b/apis/ctms/_utils/storage.js
new file mode 100644
index 0000000..8790ade
--- /dev/null
+++ b/apis/ctms/_utils/storage.js
@@ -0,0 +1,95 @@
+import constant from './constant'
+
+// 存储变量名前缀
+let storageKey = constant.storageKey;
+
+const storage = {
+ init: function(key) {
+ if (key === storageKey) {
+ return false;
+ }
+ if (typeof key === 'string') {
+ return key;
+ } else if (typeof key === 'object') {
+ return key['prefix'];
+ }
+ },
+ set: function(key, value, params = null) {
+ var _key = this.init(key);
+ // console.log('比较两个KEY', key, _key)
+ if (!_key) {
+ return;
+ }
+ let tmp = uni.getStorageSync(storageKey)
+ tmp = tmp ? tmp : {}
+ if (_key === key) {
+ tmp[key] = value;
+ } else {
+ tmp[_key] = tmp[_key] || {};
+ if (params === null || params === 'undefined') {
+ //不加params参数,则将该项原有数据全部抹除后写入新value作为对象唯一的一个值
+ //只有在明确设置了为null 或者 undifined才是
+ //注意:已知问题:参数(object的键名)不允许是负数
+ tmp[_key] = {
+ 0: value
+ };
+ } else {
+ //添加参数,则为指定覆盖方式,对其他项不产生影响
+ tmp[_key][params] = value;
+ }
+ }
+
+ uni.setStorageSync(storageKey, tmp)
+ },
+ get: function(key, params = null) {
+ var _key = this.init(key);
+ if (!_key) {
+ return false;
+ }
+ let tmp = uni.getStorageSync(storageKey)
+ tmp = tmp ? tmp : {}
+ if (_key === key) {
+ return tmp[key] || "";
+ } else {
+ return (tmp[_key] ? (tmp[_key][params] || "") : "");
+ }
+ },
+ all: function(key) {
+ //获取指定键的全部缓存
+ var _key = this.init(key);
+ if (!_key) {
+ return false;
+ }
+ let tmp = uni.getStorageSync(storageKey)
+ tmp = tmp ? tmp : {}
+ if (_key === key) {
+ return tmp[key] || "";
+ } else {
+ return tmp[_key] || [];
+ }
+ },
+ remove: function(key, params = null) {
+ var _key = this.init(key);
+ if (!_key) {
+ return;
+ }
+ let tmp = uni.getStorageSync(storageKey)
+ tmp = tmp ? tmp : {}
+ if (_key === key) {
+ delete tmp[key];
+ } else {
+ delete tmp[_key][params];
+ }
+ uni.setStorageSync(storageKey, tmp)
+ },
+ clean: function() {
+ uni.removeStorageSync(storageKey)
+ },
+ info: function() {
+ //返回当前缓存情况 https://uniapp.dcloud.net.cn/api/storage/storage.html#getstorageinfo
+ //currentSize 当前占用空间 kb; keys,所有缓存键key
+ return uni.getStorageInfoSync(); //只能获取全部,无法指定key
+ }
+}
+
+export default storage
\ No newline at end of file
diff --git a/apis/ctms/_utils/upload.js b/apis/ctms/_utils/upload.js
new file mode 100644
index 0000000..af6172e
--- /dev/null
+++ b/apis/ctms/_utils/upload.js
@@ -0,0 +1,113 @@
+import store from '@/store'
+import config from '@/config/ctms.config.js'
+import {
+ getToken
+} from './auth.js'
+import errorCode from './errorCode.json'
+
+import utils from '@/utils/common.js'
+const tansParams = utils.tansParams;
+
+const timeout = 10000
+const loginPage = config.loginPage
+const request = function(param) {
+ utils.debug(param);
+
+ //url每次request请求都需要重新组织
+ let url = config.apiUrl;
+ url = url + config.url_entry + param.url + '.' + config.url_suffix;
+ if (param.force_url) {
+ url = param.force_url;
+ }
+ // get请求映射params参数
+ if (param.params) {
+ url = url + '?' + tansParams(param.params)
+ url = url.slice(0, -1)
+ }
+ // 是否需要设置 token
+ const isToken = (param.headers || {}).isToken === false
+ config.header = param.headers || {} //TODO,未成功使用
+ if (getToken() && !isToken) {
+ config.header['Authorization'] = 'hi-ctms-client ' + getToken()
+ }
+
+ let postdata = param.data || {};
+ postdata.pid = config.pid || 0;
+
+ var user = store.state.user;
+ postdata.uid = user.info.id || 0;
+
+ return new Promise((resolve, reject) => {
+ uni.request({
+ method: param.method || 'GET',
+ timeout: param.timeout || timeout,
+ url: url,
+ data: postdata,
+ header: config.header,
+ dataType: param.dataType || 'json',
+ success: function(res) {
+ // utils.debug(res);
+ if (res.statusCode === 200) {
+ //请求成功
+ const code = res.data.code || 0
+ //只有0,200这两种状态码可以返回数据,以便下一步操作;其他状态码无法进入到下一步
+ const msg = res.data.msg || errorCode[code] || errorCode['default']
+ switch (code) {
+ default:
+ resolve(false);
+ if (getApp().globalData.config.isDebug) {
+ reject(msg) //调试台显示错误提示
+ }
+ break;
+ case 401:
+ utils.showConfirm('登录状态已过期,您可以继续留在该页面,或者重新登录').then(res => {
+ if (res.confirm) {
+ store.dispatch('LogOut').then(res => {
+ uni.reLaunch({
+ url: loginPage
+ })
+ })
+ }
+ })
+ reject('无效的会话,或者会话已过期,请重新登录。')
+ break;
+ case 100:
+ case 101:
+ resolve(false);
+ uni.showToast({
+ title: msg,
+ icon: "error"
+ });
+ break;
+ case 0:
+ case 200:
+ resolve(res.data) //返回的只是数据
+ break;
+ }
+
+ } else if (res.statusCode === 500) {
+ reject('500')
+ } else {
+ reject(res.statusCode)
+ }
+ },
+ fail: (error) => {
+ let {
+ errMsg
+ } = error, message = ""
+ if (errMsg == 'request:fail') {
+ message = '云端连接异常'
+ } else if (errMsg == 'Network Error') {
+ message = '后端接口连接异常'
+ } else if (errMsg.includes('timeout')) {
+ message = '系统接口请求超时'
+ } else if (errMsg.includes('Request failed with status code')) {
+ message = '系统接口' + message.substr(message.length - 3) + '异常'
+ }
+ reject(message)
+ }
+ })
+ })
+}
+
+export default request
\ No newline at end of file
diff --git a/apis/ctms/ads.js b/apis/ctms/ads.js
new file mode 100644
index 0000000..4722e2c
--- /dev/null
+++ b/apis/ctms/ads.js
@@ -0,0 +1,29 @@
+import request from './_utils/request.js'
+import apis from './apis.json'
+
+export default {
+ // 开屏广告
+ splash: function() {
+ const data = {}
+ let url = apis.AdsSplash;
+ return request({
+ 'url': url,
+ // 'force_url': '', //强制指定URL,忽略上面的url设定
+ 'method': 'GET',
+ 'data': data,
+ 'params': {}
+ }).then((res) => {
+ if (res.code == 200) return res.data;
+ })
+ },
+ // BANNER
+ banner: function() {
+ let url = apis.AdsBanner;
+ return request({
+ 'url': url,
+ 'method': 'GET'
+ }).then((res) => {
+ if (res.code == 200) return res.data;
+ })
+ }
+}
\ No newline at end of file
diff --git a/apis/ctms/apis copy.json b/apis/ctms/apis copy.json
new file mode 100644
index 0000000..4c8cb0e
--- /dev/null
+++ b/apis/ctms/apis copy.json
@@ -0,0 +1,53 @@
+/*————接口预设————*/
+{
+ "index": "/index/index",
+ "IndexData": "/index/h5data",
+ "AdsSplash": "/index/ads-splash",
+ "AdsBanner": "/index/ads-banner",
+ "OrderSearch": "/order/list",
+ "OrderSearchToday": "/order/today",
+ "OrderSearchYesterday": "/order/yesterday",
+ "OrderSearchFuture": "/order/futrue",
+ "OrderSearchWeek": "/order/week",
+ "OrderSearchPreWeek": "/order/preweek",
+ "OrderSearchMonth": "/order/month",
+ "OrderSearchPreMonth": "/order/premonth",
+
+ "OrderSearchDongbei": "/order/dongbei", //东三省
+ "OrderSearchArea1": "/order/area1", //京津冀
+ "OrderSearchArea2": "/order/area2", //川渝云贵
+ "OrderSearchArea3": "/order/area3", //江浙沪
+
+ "OrderSearchNocheck": "/order/nocheck", //待验车
+ "OrderSearchMine": "/order/mine", //指派我的或我创建的
+ "OrderSearchTonghang": "/order/tonghang", //同行运单
+
+ "OrderDetail": "/order/detail",
+ "OrderCreate": "/order/create",
+ "OrderCheck": "/ordercheck/basic",
+ "JiaocheSearch": "/jiaoche/list",
+ "JiaocheDetail": "/jiaoche/detail",
+ "JiaocheCreate": "/jiaoche/create",
+ "BookSearch": "/orderpre/list",
+ "BookDetail": "/orderpre/detail",
+ "BookCreate": "/orderpre/create",
+ "CarList": "/car/list",
+ "CarDetail": "/car/detail",
+ "StoreList": "/store/list",
+ "StoreDetail": "/store/detail",
+ "TruckList": "/truck/list",
+ "TruckDetail": "/truck/detail",
+ "WeituorenSearch": "/weituoren/list",
+ "WeituorenDetail": "/weituoren/detail",
+
+ "MemberList": "/member/list",
+ "MemberDetail": "/member/detail",
+
+ "UserLogin": "/user/login",
+ "UserReg": "/user/register",
+ "UserDetail": "/user/detail",
+ "UserLogout": "/user/logout",
+
+ "UploadImage": "/upload/image",
+ "UploadImages": "/upload/images"
+}
\ No newline at end of file
diff --git a/apis/ctms/apis.json b/apis/ctms/apis.json
new file mode 100644
index 0000000..30fd0ae
--- /dev/null
+++ b/apis/ctms/apis.json
@@ -0,0 +1,59 @@
+/*————接口预设————*/
+{
+ "index": "/index/index",
+ "IndexData": "/index/h5data",
+ "AdsSplash": "/index/ads-splash",
+ "AdsBanner": "/index/ads-banner",
+ //获取短信验证码
+ "getVcode": "/sms/vcode",
+ "getCwVcode": "/sms/caiwu",
+
+ "OrderSearch": "/order/list",
+ "OrderDetail": "/order/detail",
+ "OrderCreate": "/order/create",
+ "OrderCancel": "/order/cancel",
+ "OrderCheck": "/ordercheck/basic",
+
+ "OrderBookSearch": "/orderpre/list",
+ "OrderBookDetail": "/orderpre/detail",
+ "OrderBookCreate": "/orderpre/create",
+ "OrderBookEdit": "/orderpre/edit",
+ "OrderBookCancel": "/orderpre/cancel",
+
+ "UserLogin": "/fans/login",
+ "UserLoginSms": "/fans/login-sms",
+ "UserAuth": "/fans/auth",
+ "UserReg": "/fans/register",
+ "UserDetail": "/fans/detail",
+ "UserLogout": "/fans/logout",
+
+ "NewsPriceList": "/news/price-list",
+ "NewsPriceDetail": "/news/price-detail",
+ "NewsSearch": "/news/list",
+ "NewsDetail": "/news/detail",
+ "NewsAjax": "/news/ajax",
+ "NewsCatList": "/newscat/list",
+ "NoticeList": "/notice/list",
+ "NoticeDetail": "/notice/detail",
+
+ "JiaocheSearch": "/jiaoche/list",
+ "JiaocheDetail": "/jiaoche/detail",
+ "JiaocheCreate": "/jiaoche/create",
+ "BookSearch": "/orderpre/list",
+ "BookDetail": "/orderpre/detail",
+ "BookCreate": "/orderpre/create",
+ "CarList": "/car/list",
+ "CarDetail": "/car/detail",
+ "StoreList": "/store/list",
+ "StoreDetail": "/store/detail",
+ "TruckList": "/truck/list",
+ "TruckDetail": "/truck/detail",
+ "WeituorenSearch": "/weituoren/list",
+ "WeituorenDetail": "/weituoren/detail",
+
+ "MemberList": "/member/list",
+ "MemberDetail": "/member/detail",
+
+ "UploadImage": "/upload/image",
+ "UploadImages": "/upload/images"
+}
\ No newline at end of file
diff --git a/apis/ctms/fab.js b/apis/ctms/fab.js
new file mode 100644
index 0000000..038ce67
--- /dev/null
+++ b/apis/ctms/fab.js
@@ -0,0 +1,85 @@
+export default {
+ // 登录方法
+ login: function(username, password, smscode, uuid) {
+ const data = {
+ username,
+ password,
+ smscode,
+ uuid
+ }
+ return request({
+ 'url': apis.UserLogin,
+ headers: {
+ isToken: false
+ },
+ 'method': 'post',
+ 'data': data
+ })
+ },
+
+ // 注册方法
+ register: function(data) {
+ return request({
+ url: apis.UserReg,
+ headers: {
+ isToken: false
+ },
+ method: 'post',
+ data: data
+ })
+ },
+
+ // 获取用户详细信息
+ getInfo: function() {
+ return request({
+ 'url': apis.UserDetail,
+ 'method': 'get'
+ })
+ },
+
+ // 退出方法
+ logout: function() {
+ return request({
+ 'url': userLogout,
+ 'method': 'post'
+ })
+ },
+ // 用户密码重置
+ updateUserPwd: function(oldPassword, newPassword) {
+ const data = {
+ oldPassword,
+ newPassword
+ }
+ return request({
+ url: '/system/user/profile/updatePwd',
+ method: 'put',
+ params: data
+ })
+ },
+
+ // 查询用户个人信息
+ getUserProfile: function() {
+ return request({
+ url: '/system/user/profile',
+ method: 'get'
+ })
+ },
+
+ // 修改用户个人信息
+ updateUserProfile: function(data) {
+ return request({
+ url: '/system/user/profile',
+ method: 'put',
+ data: data
+ })
+ },
+
+ // 用户头像上传
+ uploadAvatar: function(data) {
+ return upload({
+ url: '/system/user/profile/avatar',
+ name: data.name,
+ filePath: data.filePath
+ })
+ }
+}
\ No newline at end of file
diff --git a/apis/ctms/index.js b/apis/ctms/index.js
new file mode 100644
index 0000000..7b44cf7
--- /dev/null
+++ b/apis/ctms/index.js
@@ -0,0 +1,55 @@
+import user from './user.js';
+import ads from './ads.js';
+import order from './order.js';
+import orderpre from './orderpre.js';
+import notice from './notice.js';
+import news from './news.js';
+import vcode from './vcode.js';
+import sync from './sync.js';
+import fab from './fab.js';
+import constant from "./_utils/constant.js";
+import storage from './_utils/storage.js';
+
+//处理缓存
+const cache = {
+ size: function() {
+ var info = storage.info();
+ var size = info.currentSize,
+ kb, m;
+ kb = size % 1000;
+ m = size / 1000 - kb;
+ return {
+ 'm': m,
+ 'kb': kb
+ }
+ },
+ clear: function() {
+ uni.showModal({
+ title: '您在本机上存储的数据将被抹除,请确认',
+ cancelText: '我再想想',
+ confirmText: '确认',
+ success() {
+ storage.clean();
+ return true;
+ },
+ fail() {
+ return false;
+ }
+ })
+ }
+}
+
+const ctms = {
+ user,
+ ads,
+ order,
+ orderpre,
+ notice,
+ news,
+ vcode,
+ sync,
+ fab,
+ constant,
+ cache
+}
+export default ctms;
\ No newline at end of file
diff --git a/apis/ctms/news.js b/apis/ctms/news.js
new file mode 100644
index 0000000..ae2c0f9
--- /dev/null
+++ b/apis/ctms/news.js
@@ -0,0 +1,209 @@
+import request from './_utils/request.js'
+import apis from './apis.json'
+import constant from './_utils/constant.js'
+import storage from './_utils/storage.js'
+export default {
+ //查询运单
+ search: function(formData = null, page = 0, psize = 0, ls = null) {
+ page = page || 1;
+ psize = psize || 10;
+
+ var data = {
+ 'search[title]': formData.title,
+ 'search[cid]': formData.cid,
+ page: page,
+ psize: psize, //分页数据大小
+ };
+ var url = apis.NewsSearch;
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ }).then((res) => {
+ if (!res) {
+ storage.set(constant.newsList, {});
+ return false;
+ }
+ switch (res.code) {
+ default:
+ uni.showToast({
+ title: "没有查询到相关内容!",
+ icon: "fail"
+ });
+ break;
+ case 0:
+ var news = {};
+ var totalCount = 0;
+ storage.set(constant.newsList, news, 'page-' + page);
+ break;
+ case 200:
+ var news = res.data.news;
+ var totalCount = res.data.total;
+ storage.set(constant.newsList, totalCount, 'total');
+ storage.set(constant.newsList, news, 'page-' + page);
+ for (var x in news) {
+ var detail = news[x];
+ var id = detail.id;
+ storage.set(constant.newsDetail, detail, id);
+ }
+ break;
+ }
+ return res.data;
+ })
+ },
+
+ //列表,从本地缓存中加载
+ list: function(page = 0) {
+ //取缓存
+ var total = storage.get(constant.newsList, 'total');
+ if (total) {
+ var news = storage.get(constant.newsList, 'page-' + page);
+ if (news) {
+ return {
+ 'total': total,
+ 'news': news
+ }
+ }
+ }
+ return false;
+ },
+
+ //详情,网络更新
+ checkDetail: function(id) {
+ var data = {
+ id: id
+ };
+ var url = apis.NewsDetail;
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ 'params': {}
+ }).then((res) => {
+ if (res.code == 200) {
+ var detail = res.data;
+ storage.set(constant.newsDetail, detail, id);
+ return res;
+ } else {
+ uni.showToast({
+ title: "信息获取失败!",
+ icon: "fail"
+ });
+ }
+ })
+ },
+
+ //详情,从缓存中读取
+ detail: function(id) {
+ return storage.get(constant.newsDetail, id);
+ },
+
+ //AJAX操作
+ ajax: function(id, op) {
+ var data = {
+ id: id,
+ op: op,
+ };
+ var url = apis.NewsAjax;
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ 'params': {}
+ }).then((res) => {
+ if (res.code == 200) {
+ var detail = res.data;
+ storage.set(constant.newsDetail, detail, id);
+ return res;
+ }
+ })
+ },
+
+ // 取文章分类
+ cats: function() {
+ var url = apis.NewsCatList;
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ 'method': 'GET',
+ 'data': {},
+ "headers": header,
+ 'params': {}
+ }).then((res) => {
+ if (res.code == 200) {
+ var cats = res.data.cats;
+ return cats;
+ }
+ })
+ },
+
+ //标记文章浏览记录
+ viewed: function(id) {
+ var ls = constant.newsViewed;
+ var res = uni.getStorageSync(ls) || {};
+ if (!res[id]) {
+ res[id] = id;
+ uni.setStorageSync(ls, res);
+ this.ajax(id, 'view');
+ return true;
+ }
+ },
+
+ //标记文章状态(纯缓存记录)(id,内容ID,op为具体操作-默认为取全部,type为状态类型)
+ mark: function(id, type = null, op = false) {
+ //不归入统一的缓存集合,以确保不在清除缓存时被误清除
+ if (!type) {
+ return false;
+ }
+ var ls, opp_set, opp_del;
+ switch (type) {
+ case 'reading':
+ //在读
+ ls = constant.newsReading;
+ opp_set = 'read';
+ opp_del = 'no_read';
+ break;
+ case 'liked':
+ //喜欢
+ ls = constant.newsLiked;
+ opp_set = 'like';
+ opp_del = 'no_like';
+ break;
+ }
+ var res = uni.getStorageSync(ls) || {};
+ if (!op) {
+ return res;
+ }
+ var data = res,
+ ret = false;
+ switch (op) {
+ case 'set':
+ if (id && !data[id]) {
+ data[id] = id;
+ uni.setStorageSync(ls, data);
+ ret = true;
+ this.ajax(id, opp_set);
+ }
+ break;
+ case 'get':
+ ret = data[id] || false;
+ break;
+ case 'del':
+ delete data[id];
+ uni.setStorageSync(ls, data);
+ ret = true;
+ this.ajax(id, opp_del);
+ break;
+ default:
+ ret = res;
+ }
+ return ret;
+ }
+}
\ No newline at end of file
diff --git a/apis/ctms/notice.js b/apis/ctms/notice.js
new file mode 100644
index 0000000..9b615aa
--- /dev/null
+++ b/apis/ctms/notice.js
@@ -0,0 +1,69 @@
+import request from './_utils/request.js'
+import apis from './apis.json'
+import constant from './_utils/constant.js'
+import storage from './_utils/storage.js'
+export default {
+ //列表
+ list: function(page = 0, psize = 10) {
+ var data = {
+ page: page,
+ psize: psize, //分页数据大小
+ };
+ var url = apis.NoticeList;
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ }).then((res) => {
+ switch (res.code) {
+ default:
+ break;
+ case 0:
+ var notices = {};
+ var totalCount = 0;
+ storage.set(constant.noitceList, notices, 'page-' + page);
+ break;
+ case 200:
+ var notices = res.data.notices;
+ var totalCount = res.data.total;
+ storage.set(constant.noticeList, totalCount, 'total');
+ storage.set(constant.noitceList, notices, 'page-' + page);
+ for (var x in notices) {
+ storage.set(constant.noticeDetail, notices[x], notices[x].id);
+ }
+ break;
+ }
+ return res.data;
+ })
+ },
+
+ //详情
+ detail: function(id) {
+ var data = {
+ id: id
+ };
+ var url = apis.NoticeDetail;
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ 'params': {}
+ }).then((res) => {
+ if (res.code == 200) {
+ var notice = res.data;
+ storage.set(constant.noticeDetail, notice, id);
+ return res;
+ } else {
+ uni.showToast({
+ title: "信息获取失败!",
+ icon: "fail"
+ });
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/apis/ctms/order.js b/apis/ctms/order.js
new file mode 100644
index 0000000..f1ef68a
--- /dev/null
+++ b/apis/ctms/order.js
@@ -0,0 +1,220 @@
+import request from './_utils/request.js'
+import apis from './apis.json'
+import constant from './_utils/constant.js'
+import storage from './_utils/storage.js'
+export default {
+ //存取草稿(只允许1+5条记录,第1条覆盖保存,后5条循环保存)
+ draft: function(formData, index = 0) {
+ var lsIndex = constant.orderForm;
+ // 指定第1条
+ if (index === null) {
+ return storage.set(lsIndex, formData, 0);
+ }
+ //指定第几条缓存
+ var i = Number(index);
+ if (i > 0) {
+ return storage.set(lsIndex, formData, i);
+ }
+ //确认上次缓存的是第几条
+ var lastIndex = storage.get(lsIndex, 'lastIndex');
+ var li = lastIndex ? lastIndex : 0;
+ if (li < 5) {
+ li += 1;
+ } else {
+ li = 1;
+ }
+ storage.set(lsIndex, li, 'lastIndex');
+ return storage.set(lsIndex, formData, li);
+
+ },
+ getDraft: function(index = null) {
+ var lsIndex = constant.orderForm;
+ index = index || 0;
+ return storage.get(lsIndex, index);
+ },
+ delDraft: function(index = null) {
+ var lsIndex = constant.orderForm;
+ index = index || 0;
+ storage.remove(lsIndex, index);
+ },
+
+ //删除缓存
+ delDetail: function(oid) {
+ storage.remove(constant.orderDetail, oid);
+ },
+
+ //取消订单
+ cancel: function(oid) {
+ //网络请求
+ var data = {
+ 'id': oid
+ };
+ var url = apis.OrderCancel;
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ }).then((res) => {
+ if (!res) {
+ return false;
+ }
+ return res.data;
+ })
+ },
+
+ // 在线下单
+ create: function(formData) {
+ //缓存表单
+ var lsIndex = constant.orderCreateForm
+ storage.set(lsIndex, formData);
+ //网络请求
+ var data = formData;
+ var url = apis.OrderCreate;
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ })
+ },
+
+ //查询运单
+ search: function(formData = null, page = 0, psize = 0, ls = null) {
+ page = page || 1;
+ psize = psize || 10;
+ //缓存表单
+ var lsIndex = ls || constant.orderSearchA
+ if (formData) {
+ storage.set(lsIndex, formData);
+ } else {
+ formData = storage.get(lsIndex)
+ }
+
+ var data = {
+ 'search[carno]': formData.carno,
+ 'search[sn]': formData.ordersn ? formData.ordersn : 0,
+ 'search[phone]': formData.phone,
+ page: page,
+ psize: psize, //分页数据大小
+ };
+ var url = apis.OrderSearch;
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ }).then((res) => {
+ if (!res) {
+ storage.set(constant.orderList, {});
+ return false;
+ }
+ switch (res.code) {
+ default:
+ uni.showToast({
+ title: "没有查询到相关订单!",
+ icon: "fail"
+ });
+ break;
+ case 0:
+ var orders = {};
+ var totalCount = 0;
+ storage.set(constant.orderList, orders, 'page-' + page);
+ break;
+ case 200:
+ var orders = res.data.orders;
+ var totalCount = res.data.total;
+ storage.set(constant.orderList, totalCount, 'total');
+ storage.set(constant.orderList, orders, 'page-' + page);
+ for (var x in orders) {
+ var order = orders[x];
+ var oid = order.id;
+ storage.set(constant.orderDetail, order, oid);
+ }
+ break;
+ }
+ return res.data;
+ })
+ },
+
+ //运单列表,从本地缓存中加载
+ list: function(page = 0) {
+ //取缓存
+ var total = storage.get(constant.orderList, 'total');
+ if (total) {
+ var orders = storage.get(constant.orderList, 'page-' + page);
+ if (orders) {
+ return {
+ 'total': total,
+ 'orders': orders
+ }
+ }
+ }
+ return false;
+ },
+
+ //运单详情,网络更新
+ checkDetail: function(oid) {
+ var data = {
+ oid: oid
+ };
+ var url = apis.OrderDetail;
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ 'params': {}
+ }).then((res) => {
+ if (res.code == 200) {
+ var order = res.data;
+ storage.set(constant.orderDetail, order, oid);
+ return res.data;
+ } else {
+ uni.showToast({
+ title: "订单信息获取失败!",
+ icon: "fail"
+ });
+ }
+ })
+ },
+
+ //运单详情,从缓存中读取
+ detail: function(oid) {
+ return storage.get(constant.orderDetail, oid);
+ },
+
+ //运单验车
+ yanche: function(oid, checks, op) {
+ var data = {
+ oid: oid,
+ op: op,
+ checks: checks,
+ };
+ var url = apis.OrderCheck;
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ 'params': {}
+ }).then((res) => {
+ if (res.code == 200) {
+ return res.data;
+ } else {
+ return false;
+ }
+ })
+ }
+
+}
\ No newline at end of file
diff --git a/apis/ctms/orderpre.js b/apis/ctms/orderpre.js
new file mode 100644
index 0000000..269dfd7
--- /dev/null
+++ b/apis/ctms/orderpre.js
@@ -0,0 +1,183 @@
+import request from './_utils/request.js'
+import apis from './apis.json'
+import constant from './_utils/constant.js'
+import storage from './_utils/storage.js'
+export default {
+ //存取草稿(只允许1+5条记录,第1条覆盖保存,后5条循环保存)
+ draft: function(formData, index = 0) {
+ var lsIndex = constant.orderBookForm;
+ // 指定第1条
+ if (index === null) {
+ return storage.set(lsIndex, formData, 0);
+ }
+ //指定第几条缓存
+ var i = Number(index);
+ if (i > 0) {
+ return storage.set(lsIndex, formData, i);
+ }
+ //确认上次缓存的是第几条
+ var lastIndex = storage.get(lsIndex, 'lastIndex');
+ var li = lastIndex ? lastIndex : 0;
+ if (li < 5) {
+ li += 1;
+ } else {
+ li = 1;
+ }
+ storage.set(lsIndex, li, 'lastIndex');
+ return storage.set(lsIndex, formData, li);
+
+ },
+ getDraft: function(index = null) {
+ var lsIndex = constant.orderBookForm;
+ index = index || 0;
+ return storage.get(lsIndex, index);
+ },
+ delDraft: function(index = null) {
+ var lsIndex = constant.orderBookForm;
+ index = index || 0;
+ storage.remove(lsIndex, index);
+ },
+
+ //删除缓存
+ delDetail: function(oid) {
+ storage.remove(constant.orderBookDetail, oid);
+ },
+
+ // 下单询价
+ create: function(formData) {
+ //缓存表单
+ this.draft(formData)
+ //网络请求
+ var data = formData;
+ var url = apis.OrderBookCreate;
+ if (formData.id) url = apis.OrderBookEdit; //有ID传入时,即为更新
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ })
+ },
+
+ cancel: function(oid) {
+ //网络请求
+ var data = {
+ 'id': oid
+ };
+ var url = apis.OrderBookCancel;
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ }).then((res) => {
+ if (!res) {
+ return false;
+ }
+ return res.data;
+ })
+ },
+
+ //获取询价单列表
+ list: function(formData = null, page = 0, psize = 10, ls = null) {
+ page = page || 1;
+ psize = psize || 10;
+ //缓存表单
+ var lsIndex = ls || constant.orderBookSearch
+ if (formData) {
+ storage.set(lsIndex, formData);
+ } else {
+ formData = storage.get(lsIndex)
+ }
+
+ var data = {
+ 'search[carno]': formData.carno,
+ 'search[sn]': formData.ordersn ? formData.ordersn : 0,
+ 'search[phone]': formData.phone,
+ page: page,
+ psize: psize, //分页数据大小
+ };
+ var url = apis.OrderBookSearch;
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ }).then((res) => {
+ switch (res.code) {
+ default:
+ uni.showToast({
+ title: "没有查询到相关订单!",
+ icon: "fail"
+ });
+ break;
+ case 0:
+ var orders = {};
+ var totalCount = 0;
+ storage.set(constant.orderBookList, orders, 'page-' + page);
+ break;
+ case 200:
+ var orders = res.data.orders;
+ var totalCount = res.data.total;
+ storage.set(constant.orderBookList, totalCount, 'total');
+ storage.set(constant.orderBookList, orders, 'page-' + page);
+ for (var x in orders) {
+ var order = orders[x];
+ var oid = order.id;
+ storage.set(constant.orderBookDetail, order, oid);
+ }
+ break;
+ }
+ return res.data;
+ })
+ },
+
+ //询价单详情
+ //@oid,cache(是否使用缓存)
+ detail: function(oid, cache = null) {
+ var data = {
+ id: oid
+ };
+ var url = apis.OrderBookDetail;
+ if (cache) {
+ return new Promise((resolve, reject) => {
+ var res = storage.get(constant.orderBookDetail, oid);
+ if (res) {
+ resolve(res)
+ } else {
+ // reject('没有查询到该运单的缓存')
+ resolve(false)
+ }
+ });
+ }
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ 'params': {}
+ }).then((res) => {
+ if (res.code == 200) {
+ var order = res.data;
+ storage.set(constant.orderBookDetail, order, oid);
+ return res.data;
+ } else {
+ uni.showToast({
+ title: "询价单信息获取失败!",
+ icon: "fail"
+ });
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/apis/ctms/sync.js b/apis/ctms/sync.js
new file mode 100644
index 0000000..2ab886a
--- /dev/null
+++ b/apis/ctms/sync.js
@@ -0,0 +1,77 @@
+// 对异步函数进行同步化模拟
+const Confirm = {
+ modalPromise: function(title, content, editable) {
+ return new Promise((resolve, reject) => {
+ uni.showModal({
+ title: title,
+ content: content,
+ editable: editable,
+ success: (res) => {
+ if (res.confirm) {
+ if (editable) {
+ resolve(res.content);
+ } else {
+ resolve(true);
+ }
+ } else if (res.cancel) {
+ resolve(false);
+ }
+ },
+ fail: (err) => {
+ reject(err);
+ }
+ });
+ });
+ },
+
+ doSync: async function(title, content, editable) {
+ try {
+ const res = await this.modalPromise(title, content, editable);
+ // console.log('对话框返回', res)
+ return res;
+ } catch (error) {
+ // console.error('Error:', error);
+ // 处理错误或用户取消操作...
+ }
+ }
+}
+
+const Actions = {
+ actionPromise: function(title, list) {
+ return new Promise((resolve, reject) => {
+ uni.showActionSheet({
+ title: title,
+ itemList: list,
+ success: function(res) {
+ // console.log('授权点击', res)
+ var index = res.tapIndex;
+ var item = list[index];
+ resolve({
+ 'index': index,
+ 'item': item
+ })
+ },
+ fail: function(res) {
+ // console.log(res.errMsg);
+ resolve(false)
+ }
+ });
+ });
+ },
+
+ doSync: async function(title, list) {
+ try {
+ const res = await this.actionPromise(title, list);
+ // console.log('actionsheet点击返回', res)
+ return res;
+ } catch (error) {
+ // console.error('Error:', error);
+ // 处理错误或用户取消操作...
+ }
+ }
+}
+
+export default {
+ Confirm,
+ Actions
+}
\ No newline at end of file
diff --git a/apis/ctms/user.js b/apis/ctms/user.js
new file mode 100644
index 0000000..8a369e9
--- /dev/null
+++ b/apis/ctms/user.js
@@ -0,0 +1,319 @@
+import request from './_utils/request.js'
+import apis from './apis.json'
+import constant from './_utils/constant.js'
+import _sync from './sync.js'
+import config from "@/config/ctms.config.js";
+import store from '@/store/index.js';
+
+export default {
+ //检查登陆,返回用户信息
+ checkLogin: function() {
+ var user = store.state.user,
+ isCloud = config.isUserUnicloud;
+ if (user.hasLogin && !isCloud) {
+ return user.info;
+ }
+ var userCloud = store.state.userCloud;
+ if (isCloud && userCloud.hasLogin) {
+ var data = {
+ mobile: userCloud.mobile,
+ openid: userCloud.openid,
+ username: userCloud.mobile
+ }
+ this.authLogin(data);
+ return data;
+ }
+ return false;
+ },
+
+ // 获取用户信息
+ getInfo: function() {
+ var user = store.state.user,
+ isCloud = config.isUserUnicloud;
+ if (user.hasLogin && !isCloud) {
+ return user.info;
+ }
+ var userCloud = store.state.userCloud;
+ if (isCloud && userCloud.hasLogin) {
+ return {
+ mobile: userCloud.mobile,
+ openid: userCloud.openid,
+ username: userCloud.mobile
+ }
+ }
+ return false;
+ },
+
+ //一键授权
+ oneKeyAuth: async function() {
+ var _that = this;
+ var isCloud = config.isUserUnicloud;
+ if (!isCloud) {
+ uni.showToast({
+ icon: 'none',
+ title: '应用未开启云服务支持'
+ })
+ }
+
+ var user = store.state.user,
+ userCloud = store.state.userCloud,
+ list = [];
+ if (!userCloud.hasLogin) {
+ return uni.showModal({
+ title: '提示',
+ content: '请先登陆云平台',
+ showCancel: true,
+ cancelText: '放弃',
+ success() {
+ uni.navigateTo({
+ url: 'uni_modules/uni-id-pages/pages/login/login-withoutpwd'
+ })
+ }
+ })
+ }
+ var _info = userCloud.info,
+ openid = userCloud.openid,
+ mobile = userCloud.mobile;
+ var reg = new RegExp(
+ /^(?:(?:\+|00)86)?1(?:(?:3\d)|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8\d)|(?:9[189]))\d{8}$/
+ );
+ var matches = reg.exec(mobile);
+
+ if (matches['length'] == 1 && matches['0'] == mobile) {
+ list.unshift(mobile)
+ } else if (openid) {
+ list.unshift('同意')
+ } else {
+ return uni.showToast({
+ icon: 'fail',
+ title: '无效的平台信息'
+ })
+ }
+ var res = await _sync.Actions.doSync('请确认授权', list);
+ if (res) {
+ var user = {
+ mobile: mobile,
+ openid: openid,
+ isLong: true
+ }
+ var user = await _that.authLogin(user);
+ // console.log('登陆授权返回', user)
+ return user;
+ }
+ return false;
+ },
+
+ // 登陆,成功后执行相应的缓存操作
+ login: function(formData) {
+ var isLong = formData.isLong || false;
+ var data = {
+ username: formData.username,
+ passwd: formData.passwd,
+ isLong: isLong
+ };
+
+ var url = apis.UserLogin;
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ // 'force_url': '', //强制指定URL,忽略上面的url设定
+ 'method': 'post',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ }).then((res) => {
+ if (res.code == 200) {
+ // utils.debug(res.data);
+ var user = store.state.user;
+ var _info = res.data.user;
+ var date = new Date();
+ var expireTime = date.getTime() + 3600 * 24 * 1000;
+ //过期时间,正常是24小时
+ if (isLong) {
+ date.setDate(date.getMonth() + 1);
+ //选择持久登陆时,时长改为1个月
+ expireTime = date.getTime();
+ }
+ // console.log(expireTime, _info.tokenExpired);
+ _info.expireTime = expireTime;
+ store.commit('user/login', _info) //触发@store/modules/user.js的login函数,同步执行
+ return _info;
+ } else {
+ uni.showToast({
+ title: '登陆失败',
+ icon: 'none'
+ });
+ }
+ })
+ },
+
+ // 通过短信验证码登陆,成功后执行相应的缓存操作
+ smsLogin: function(formData) {
+ var isLong = formData.isLong || false;
+ var data = {
+ mobile: formData.mobile,
+ vcode: formData.vcode,
+ isLong: isLong
+ };
+
+ var url = apis.UserLoginSms;
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ // 'force_url': '', //强制指定URL,忽略上面的url设定
+ 'method': 'post',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ }).then((res) => {
+ if (res.code == 200) {
+ // utils.debug(res.data);
+ var user = store.state.user;
+ var _info = res.data.user;
+ var date = new Date();
+ var expireTime = date.getTime() + 3600 * 24 * 1000;
+ //过期时间,正常是24小时
+ if (isLong) {
+ date.setDate(date.getMonth() + 1);
+ //选择持久登陆时,时长改为1个月
+ expireTime = date.getTime();
+ }
+ // console.log(expireTime, _info.tokenExpired);
+ _info.expireTime = expireTime;
+ store.commit('user/login', _info) //触发@store/modules/user.js的login函数,同步执行
+ return _info;
+ } else {
+ uni.showToast({
+ title: '登陆失败',
+ icon: 'none'
+ });
+ }
+ })
+ },
+
+ // 注册,成功后执行相应的缓存操作
+ reg: function(formData) {
+ var isLong = formData.isLong || false;
+ var data = {
+ username: formData.username,
+ passwd: formData.passwd,
+ vcode: formData.vcode,
+ email: formData.email,
+ isLong: isLong
+ };
+
+ var url = apis.UserReg;
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ // 'force_url': '', //强制指定URL,忽略上面的url设定
+ 'method': 'post',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ }).then((res) => {
+ if (res.code == 200) {
+ // utils.debug(res.data);
+ var user = store.state.user;
+ var _info = res.data.user;
+ var date = new Date();
+ var expireTime = date.getTime() + 3600 * 24 * 1000;
+ //过期时间,正常是24小时
+ if (isLong) {
+ date.setDate(date.getMonth() + 1);
+ //选择持久登陆时,时长改为1个月
+ expireTime = date.getTime();
+ }
+ // console.log(expireTime, _info.tokenExpired);
+ _info.expireTime = expireTime;
+ store.commit('user/login', _info) //触发@store/modules/user.js的login函数,同步执行
+ return _info;
+ }
+ })
+ },
+
+ // 一键授权登陆
+ authLogin: async function(user, from) {
+ var isLong = user.isLong || false;
+ var plat = getApp().globalData.config.openplat;
+ var from = from || plat;
+ var data = {
+ mobile: user.mobile,
+ openid: user.openid,
+ isLong: isLong,
+ from: from
+ };
+ var url = apis.UserAuth;
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return await request({
+ 'url': url,
+ 'method': 'post',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ }).then((res) => {
+ if (res.code == 200) {
+ // utils.debug(res.data);
+ var user = store.state.user;
+ var _info = res.data.user;
+ var date = new Date();
+ var expireTime = date.getTime() + 3600 * 24 * 1000;
+ //过期时间,正常是24小时
+ if (isLong) {
+ date.setDate(date.getMonth() + 1);
+ //选择持久登陆时,时长改为1个月
+ expireTime = date.getTime();
+ }
+ // console.log(expireTime, _info.tokenExpired);
+ _info.expireTime = expireTime;
+ store.commit('user/login', _info) //触发@store/modules/user.js的login函数,同步执行
+ return _info;
+ }
+ })
+ },
+
+ logout: async function() {
+ var isCloud = config.isUserUnicloud;
+ var res = await _sync.Confirm.doSync('提示', '您正在注销,请确认继续', false);
+ if (res) {
+ store.commit('user/logout') //触发@store/modules/user.js的logout函数,同步执行
+ if (isCloud) store.commit('userCloud/logout')
+ uni.showToast({
+ title: '您已注销,现在重新打开APP',
+ icon: 'none'
+ });
+ return true;
+ }
+ return false;
+ },
+
+ loginDraft(formData = {}, isGet = false) {
+ var ls = constant.userLoginForm;
+ var data = uni.getStorageSync(ls);
+ if (isGet) return data;
+ var data = {
+ ...data,
+ ...formData
+ };
+ uni.setStorageSync(ls, data);
+ },
+
+ regDraft(formData = {}, isGet = false) {
+ var ls = constant.userRegForm;
+ var data = uni.getStorageSync(ls);
+ if (isGet) return data;
+ var data = {
+ ...data,
+ ...formData
+ };
+ uni.setStorageSync(ls, data);
+ }
+}
\ No newline at end of file
diff --git a/apis/ctms/vcode.js b/apis/ctms/vcode.js
new file mode 100644
index 0000000..c322fff
--- /dev/null
+++ b/apis/ctms/vcode.js
@@ -0,0 +1,47 @@
+import request from './_utils/request.js'
+import apis from './apis.json'
+import constant from './_utils/constant.js'
+import storage from './_utils/storage.js'
+export default {
+ //手机短信验证码相关操作
+
+ // 获取验证码
+ //scence使用场景,phone发送手机号
+ get: function(scence, phone) {
+ //网络请求
+ var data = {
+ 'scence': scence,
+ 'phone': phone
+ };
+ var url = apis.getVcode;
+ if (scence === 'caiwu') {
+ url = apis.getCwVcode;
+ }
+ var header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ };
+ return request({
+ 'url': url,
+ 'method': 'POST',
+ 'data': data,
+ "headers": header,
+ 'params': {}
+ }).then(
+ function(res) {
+ var data = {};
+ if (res.msg) {
+ data.msg = res.msg;
+ }
+ if (res.code == 200) {
+ return {
+ ...res.data,
+ ...data
+ }
+ } else {
+ return false;
+ }
+ })
+ },
+
+
+}
\ No newline at end of file
diff --git a/app.config.js b/app.config.js
new file mode 100644
index 0000000..5e088e6
--- /dev/null
+++ b/app.config.js
@@ -0,0 +1,55 @@
+// 应用全局配置,App.vue挂载到getApp().globalData.config
+export default {
+ //主界面(注意是登陆成功或者开屏广告之后的页面)
+ "mainPage": "/pages/ctms/tabbar/index/index",
+ //开启调试
+ "isDebug": false,
+ //定义开放平台
+ "openplat": 'uniCloud',
+ //关于应用
+ "about": {
+ //应用名称
+ "appName": "运车助手",
+ //应用logo
+ "logo": "/static/logo.png",
+ //公司名称
+ "company": "安徽安邮车联运输有限公司",
+ //口号
+ "slogan": "安邮车联汽车托运管理平台-值得您依赖的运车管家。",
+ //应用的链接,用于分享到第三方平台和生成关于我们页的二维码
+ "download": "https://ctms.hiluker.cn",
+ //version
+ "version": "1.20240808.006", //用于非app端显示,app端自动获取
+ "agreements": {
+ serviceUrl: 'https://public.hiluker.com/ctms/client/service.html',
+ privacyUrl: 'https://public.hiluker.com/ctms/client/private.html'
+ }
+ },
+
+ "h5": {
+ "url": "https://ctms.hiluker.cn", // 前端网页托管的域名
+ // 在h5端全局悬浮引导用户下载app的功能 更多自定义要求在/common/openApp.js中修改
+ // "openApp": {
+ // //点击悬浮下载栏后打开的网页链接
+ // "openUrl": '/#/pages/uni-starter/ucenter/invite/invite',
+ // //左侧显示的应用名称
+ // "appname": '安邮车联运车平台',
+ // //应用的图标
+ // "logo": './static/logo.png',
+ // }
+ },
+ "download": { //用于生成二合一下载页面
+ "ios": "",
+ "android": ""
+ },
+ //用于打开应用市场评分界面
+ "marketId": {
+ "ios": "",
+ "android": ""
+ },
+
+ //配置多语言国际化。
+ "i18n": {
+ "enable": false //默认关闭,国际化。如果你想使用国际化相关功能,请改为true
+ }
+}
\ No newline at end of file
diff --git a/common/appInit.js b/common/appInit.js
new file mode 100644
index 0000000..0b59f4e
--- /dev/null
+++ b/common/appInit.js
@@ -0,0 +1,166 @@
+import _app_Config from '@/app.config.js';
+//应用初始化页
+// #ifdef APP-PLUS
+import checkUpdate from '@/uni_modules/uni-upgrade-center-app/utils/check-update';
+import callCheckVersion from '@/uni_modules/uni-upgrade-center-app/utils/call-check-version';
+
+// 实现,路由拦截。当应用无访问摄像头/相册权限,引导跳到设置界面 https://ext.dcloud.net.cn/plugin?id=5095
+import interceptorChooseImage from '@/uni_modules/json-interceptor-chooseImage/js_sdk/main.js';
+interceptorChooseImage()
+
+// #endif
+const db = uniCloud.database()
+export default async function() {
+ const debug = _app_Config.debug;
+
+ // _app_Config挂载到getApp().globalData.config
+ setTimeout(() => {
+ getApp({
+ allowDefault: true
+ }).globalData.config = _app_Config;
+ }, 1)
+
+
+ // 初始化appVersion(仅app生效)
+ initAppVersion();
+
+ //clientDB的错误提示
+ function onDBError({
+ code, // 错误码详见https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=returnvalue
+ message
+ }) {
+ console.log('onDBError', {
+ code,
+ message
+ });
+ // 处理错误
+ console.error(code, message);
+ }
+ // 绑定clientDB错误事件
+ db.on('error', onDBError)
+
+
+ //拦截云对象请求
+ uniCloud.interceptObject({
+ async invoke({
+ objectName, // 云对象名称
+ methodName, // 云对象的方法名称
+ params // 参数列表
+ }) {
+ // console.log('interceptObject',{
+ // objectName, // 云对象名称
+ // methodName, // 云对象的方法名称
+ // params // 参数列表
+ // });
+ if (objectName == "uni-id-co" && (methodName.includes('loginBy') || ['login',
+ 'registerUser'
+ ].includes(methodName))) {
+ // console.log('执行登录相关云对象');
+ params[0].inviteCode = await new Promise((callBack) => {
+ uni.getClipboardData({
+ success: function(res) {
+ // console.log('剪切板内容:' + res.data);
+ if (res.data.slice(0, 18) == 'uniInvitationCode:') {
+ let uniInvitationCode = res.data.slice(18, 38)
+ // console.log('当前用户是其他用户推荐下载的,推荐者的code是:' +uniInvitationCode);
+ // uni.showModal({
+ // content: '当前用户是其他用户推荐下载的,推荐者的code是:'+uniInvitationCode,
+ // showCancel: false
+ // });
+ callBack(uniInvitationCode)
+ //当前用户是其他用户推荐下载的。这里登记他的推荐者id 为当前用户的myInviteCode。判断如果是注册
+ } else {
+ callBack()
+ }
+ },
+ fail() {
+ // console.log('error--');
+ callBack()
+ },
+ complete() {
+ // #ifdef MP-WEIXIN
+ uni.hideToast()
+ // #endif
+ }
+ });
+ })
+ // console.log(params);
+ }
+ // console.log(params);
+ },
+ success(e) {
+ // console.log(e);
+ },
+ complete() {
+
+ },
+ fail(e) {
+ // console.error(e);
+ // if (debug) {
+ // uni.showModal({
+ // content: JSON.stringify(e),
+ // showCancel: false
+ // });
+ // }else{
+ // uni.showToast({
+ // title: '系统错误请稍后再试',
+ // icon:'error'
+ // });
+ // }
+ }
+ })
+
+
+ // #ifdef APP-PLUS
+ // 监听并提示设备网络状态变化
+ uni.onNetworkStatusChange(res => {
+ // console.log(res.isConnected);
+ // console.log(res.networkType);
+ if (res.networkType != 'none') {
+ uni.showToast({
+ title: '当前网络类型:' + res.networkType,
+ icon: 'none',
+ duration: 3000
+ })
+ } else {
+ uni.showToast({
+ title: '网络类型:' + res.networkType,
+ icon: 'none',
+ duration: 3000
+ })
+ }
+ });
+ // #endif
+
+}
+/**
+ * // 初始化appVersion
+ */
+function initAppVersion() {
+ // #ifdef APP-PLUS
+ let appid = plus.runtime.appid;
+ plus.runtime.getProperty(appid, (wgtInfo) => {
+ let appVersion = plus.runtime;
+ let currentVersion = appVersion.versionCode > wgtInfo.versionCode ? appVersion : wgtInfo;
+ getApp({
+ allowDefault: true
+ }).appVersion = {
+ ...currentVersion,
+ appid,
+ hasNew: false
+ }
+ // 检查更新小红点
+ callCheckVersion().then(res => {
+ // console.log('检查是否有可以更新的版本', res);
+ if (res.result.code > 0) {
+ // 有新版本
+ getApp({
+ allowDefault: true
+ }).appVersion.hasNew = true;
+ // console.log(checkUpdate());
+ }
+ })
+ });
+ // 检查更新
+ // #endif
+}
\ No newline at end of file
diff --git a/common/car-p.js b/common/car-p.js
new file mode 100644
index 0000000..8dee77a
--- /dev/null
+++ b/common/car-p.js
@@ -0,0 +1,24 @@
+export default {
+ list0: [
+ '京', '津', '冀', '晋', '蒙', '辽', '吉',
+ '黑', '沪', '苏', '浙', '皖', '闽', '赣',
+ '鲁', '豫', '鄂', '湘', '粤', '桂',
+ '琼', '渝', '川', '贵', '云', '藏',
+ '陕', '甘', '青', '宁', '新', '港', '澳', '台'
+ ],
+ //默认排序
+
+ list: [
+ '琼',
+ '京', '津', '冀',
+ '黑', '吉', '辽',
+ '川', '渝', '贵',
+ '晋', '蒙', '鲁', '豫',
+ '陕', '甘', '青', '宁', '新',
+ '沪', '苏', '浙',
+ '皖', '闽', '赣', '鄂', '湘', '粤', '桂',
+ '云', '藏',
+ '港', '澳', '台'
+ ],
+ // 自定义排序
+}
\ No newline at end of file
diff --git a/common/graceChecker.js b/common/graceChecker.js
new file mode 100644
index 0000000..b3db2d7
--- /dev/null
+++ b/common/graceChecker.js
@@ -0,0 +1,97 @@
+/**
+数据验证(表单验证)
+来自 grace.hcoder.net
+作者 hcoder 深海
+*/
+export default {
+ 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);
+ }
+}
\ No newline at end of file
diff --git a/common/html-parser.js b/common/html-parser.js
new file mode 100644
index 0000000..20a89b2
--- /dev/null
+++ b/common/html-parser.js
@@ -0,0 +1,352 @@
+/*
+ * HTML5 Parser By Sam Blowes
+ *
+ * Designed for HTML5 documents
+ *
+ * Original code by John Resig (ejohn.org)
+ * http://ejohn.org/blog/pure-javascript-html-parser/
+ * Original code by Erik Arvidsson, Mozilla Public License
+ * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
+ *
+ * ----------------------------------------------------------------------------
+ * License
+ * ----------------------------------------------------------------------------
+ *
+ * This code is triple licensed using Apache Software License 2.0,
+ * Mozilla Public License or GNU Public License
+ *
+ * ////////////////////////////////////////////////////////////////////////////
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * ////////////////////////////////////////////////////////////////////////////
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * The Original Code is Simple HTML Parser.
+ *
+ * The Initial Developer of the Original Code is Erik Arvidsson.
+ * Portions created by Erik Arvidssson are Copyright (C) 2004. All Rights
+ * Reserved.
+ *
+ * ////////////////////////////////////////////////////////////////////////////
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ----------------------------------------------------------------------------
+ * Usage
+ * ----------------------------------------------------------------------------
+ *
+ * // Use like so:
+ * HTMLParser(htmlString, {
+ * start: function(tag, attrs, unary) {},
+ * end: function(tag) {},
+ * chars: function(text) {},
+ * comment: function(text) {}
+ * });
+ *
+ * // or to get an XML string:
+ * HTMLtoXML(htmlString);
+ *
+ * // or to get an XML DOM Document
+ * HTMLtoDOM(htmlString);
+ *
+ * // or to inject into an existing document/DOM node
+ * HTMLtoDOM(htmlString, document);
+ * HTMLtoDOM(htmlString, document.body);
+ *
+ */
+// Regular Expressions for parsing tags and attributes
+var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
+var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
+var attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; // Empty Elements - HTML 5
+
+var empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr'); // Block Elements - HTML 5
+// fixed by xxx 将 ins 标签从块级名单中移除
+
+var block = makeMap('a,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'); // Inline Elements - HTML 5
+
+var inline = makeMap('abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'); // Elements that you can, intentionally, leave open
+// (and which close themselves)
+
+var closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); // Attributes that have their values filled in disabled="disabled"
+
+var fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'); // Special Elements (can contain anything)
+
+var special = makeMap('script,style');
+function HTMLParser(html, handler) {
+ var index;
+ var chars;
+ var match;
+ var stack = [];
+ var last = html;
+
+ stack.last = function () {
+ return this[this.length - 1];
+ };
+
+ while (html) {
+ chars = true; // Make sure we're not in a script or style element
+
+ if (!stack.last() || !special[stack.last()]) {
+ // Comment
+ if (html.indexOf('');
+
+ if (index >= 0) {
+ if (handler.comment) {
+ handler.comment(html.substring(4, index));
+ }
+
+ html = html.substring(index + 3);
+ chars = false;
+ } // end tag
+
+ } else if (html.indexOf('') == 0) {
+ match = html.match(endTag);
+
+ if (match) {
+ html = html.substring(match[0].length);
+ match[0].replace(endTag, parseEndTag);
+ chars = false;
+ } // start tag
+
+ } else if (html.indexOf('<') == 0) {
+ match = html.match(startTag);
+
+ if (match) {
+ html = html.substring(match[0].length);
+ match[0].replace(startTag, parseStartTag);
+ chars = false;
+ }
+ }
+
+ if (chars) {
+ index = html.indexOf('<');
+ var text = index < 0 ? html : html.substring(0, index);
+ html = index < 0 ? '' : html.substring(index);
+
+ if (handler.chars) {
+ handler.chars(text);
+ }
+ }
+ } else {
+ html = html.replace(new RegExp('([\\s\\S]*?)<\/' + stack.last() + '[^>]*>'), function (all, text) {
+ text = text.replace(/|/g, '$1$2');
+
+ if (handler.chars) {
+ handler.chars(text);
+ }
+
+ return '';
+ });
+ parseEndTag('', stack.last());
+ }
+
+ if (html == last) {
+ throw 'Parse Error: ' + html;
+ }
+
+ last = html;
+ } // Clean up any remaining tags
+
+
+ parseEndTag();
+
+ function parseStartTag(tag, tagName, rest, unary) {
+ tagName = tagName.toLowerCase();
+
+ if (block[tagName]) {
+ while (stack.last() && inline[stack.last()]) {
+ parseEndTag('', stack.last());
+ }
+ }
+
+ if (closeSelf[tagName] && stack.last() == tagName) {
+ parseEndTag('', tagName);
+ }
+
+ unary = empty[tagName] || !!unary;
+
+ if (!unary) {
+ stack.push(tagName);
+ }
+
+ if (handler.start) {
+ var attrs = [];
+ rest.replace(attr, function (match, name) {
+ var value = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ? arguments[4] : fillAttrs[name] ? name : '';
+ attrs.push({
+ name: name,
+ value: value,
+ escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') // "
+
+ });
+ });
+
+ if (handler.start) {
+ handler.start(tagName, attrs, unary);
+ }
+ }
+ }
+
+ function parseEndTag(tag, tagName) {
+ // If no tag name is provided, clean shop
+ if (!tagName) {
+ var pos = 0;
+ } // Find the closest opened tag of the same type
+ else {
+ for (var pos = stack.length - 1; pos >= 0; pos--) {
+ if (stack[pos] == tagName) {
+ break;
+ }
+ }
+ }
+
+ if (pos >= 0) {
+ // Close all the open elements, up the stack
+ for (var i = stack.length - 1; i >= pos; i--) {
+ if (handler.end) {
+ handler.end(stack[i]);
+ }
+ } // Remove the open elements from the stack
+
+
+ stack.length = pos;
+ }
+ }
+}
+
+function makeMap(str) {
+ var obj = {};
+ var items = str.split(',');
+
+ for (var i = 0; i < items.length; i++) {
+ obj[items[i]] = true;
+ }
+
+ return obj;
+}
+
+function removeDOCTYPE(html) {
+ return html.replace(/<\?xml.*\?>\n/, '').replace(/\n/, '').replace(/\n/, '');
+}
+
+function parseAttrs(attrs) {
+ return attrs.reduce(function (pre, attr) {
+ var value = attr.value;
+ var name = attr.name;
+
+ if (pre[name]) {
+ pre[name] = pre[name] + " " + value;
+ } else {
+ pre[name] = value;
+ }
+
+ return pre;
+ }, {});
+}
+
+function parseHtml(html) {
+ html = removeDOCTYPE(html);
+ var stacks = [];
+ var results = {
+ node: 'root',
+ children: []
+ };
+ HTMLParser(html, {
+ start: function start(tag, attrs, unary) {
+ var node = {
+ name: tag
+ };
+
+ if (attrs.length !== 0) {
+ node.attrs = parseAttrs(attrs);
+ }
+
+ if (unary) {
+ var parent = stacks[0] || results;
+
+ if (!parent.children) {
+ parent.children = [];
+ }
+
+ parent.children.push(node);
+ } else {
+ stacks.unshift(node);
+ }
+ },
+ end: function end(tag) {
+ var node = stacks.shift();
+ if (node.name !== tag) console.error('invalid state: mismatch end tag');
+
+ if (stacks.length === 0) {
+ results.children.push(node);
+ } else {
+ var parent = stacks[0];
+
+ if (!parent.children) {
+ parent.children = [];
+ }
+
+ parent.children.push(node);
+ }
+ },
+ chars: function chars(text) {
+ var node = {
+ type: 'text',
+ text: text
+ };
+
+ if (stacks.length === 0) {
+ results.children.push(node);
+ } else {
+ var parent = stacks[0];
+
+ if (!parent.children) {
+ parent.children = [];
+ }
+
+ parent.children.push(node);
+ }
+ },
+ comment: function comment(text) {
+ var node = {
+ node: 'comment',
+ text: text
+ };
+ var parent = stacks[0];
+
+ if (!parent.children) {
+ parent.children = [];
+ }
+
+ parent.children.push(node);
+ }
+ });
+ return results.children;
+}
+
+export default parseHtml;
diff --git a/common/letter.js b/common/letter.js
new file mode 100644
index 0000000..1d9cb20
--- /dev/null
+++ b/common/letter.js
@@ -0,0 +1,84 @@
+export default {
+ list: [
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K', 'L', 'M', 'N',
+ 'O', 'P', 'Q', 'R', 'S', 'T',
+ 'U', 'V', 'W', 'X', 'Y', 'Z'
+ ],
+ listDatacom: [{
+ value: 'A',
+ text: "A"
+ }, {
+ value: 'B',
+ text: "B"
+ }, {
+ value: 'C',
+ text: "C"
+ }, {
+ value: 'D',
+ text: "D"
+ }, {
+ value: 'E',
+ text: "F"
+ }, {
+ value: 'G',
+ text: "G"
+ }, {
+ value: 'H',
+ text: "H"
+ }, {
+ value: 'I',
+ text: "I"
+ }, {
+ value: 'J',
+ text: "J"
+ }, {
+ value: 'K',
+ text: "K"
+ }, {
+ value: 'L',
+ text: "L"
+ }, {
+ value: 'M',
+ text: "M"
+ }, {
+ value: 'N',
+ text: "N"
+ }, {
+ value: 'O',
+ text: "O"
+ }, {
+ value: 'P',
+ text: "P"
+ }, {
+ value: 'Q',
+ text: "Q"
+ }, {
+ value: 'R',
+ text: "R"
+ }, {
+ value: 'S',
+ text: "S"
+ }, {
+ value: 'T',
+ text: "T"
+ }, {
+ value: 'U',
+ text: "U"
+ }, {
+ value: 'V',
+ text: "V"
+ }, {
+ value: 'W',
+ text: "W"
+ }, {
+ value: 'X',
+ text: "X"
+ }, {
+ value: 'Y',
+ text: "Y"
+ }, {
+ value: 'Z',
+ text: "Z"
+ }]
+}
\ No newline at end of file
diff --git a/common/openApp.js b/common/openApp.js
new file mode 100644
index 0000000..43f2b0d
--- /dev/null
+++ b/common/openApp.js
@@ -0,0 +1,36 @@
+/*
+ 创建在h5端全局悬浮引导用户下载app的功能,
+ 如不需要本功能直接移除配置文件app.config.js下的h5/openApp即可
+*/
+
+import CONFIG from '../app.config.js';
+
+const CONFIG_OPEN = CONFIG.h5.openApp || {};
+// 仅H5端添加"打开APP"
+export default function() {
+ // #ifdef H5
+ if (!CONFIG_OPEN.openUrl) return;
+
+ let openLogo = CONFIG_OPEN.logo ?
+ `` : '';
+ let openApp = document.createElement("div");
+ openApp.id = 'openApp';
+ openApp.style =
+ 'position: fixed;background:#FFFFFF;box-shadow: #eeeeee 1px 1px 9px; ;top: 0;left: 0;right: 0;z-index: 999;width: 100%;height: 45px;display: flex;flex-direction: row;justify-content: space-between;align-items: center;box-sizing: border-box;padding: 0 0.5rem;'
+ openApp.innerHTML = `
+
啊,抱歉,您要访问的页面找不到了。
+ + \ No newline at end of file diff --git a/hybrid/html/local.html b/hybrid/html/local.html new file mode 100644 index 0000000..9a21210 --- /dev/null +++ b/hybrid/html/local.html @@ -0,0 +1,88 @@ + + + + + +web-view 组件加载本地 html 示例,仅在 App 环境下生效。点击下列按钮,跳转至其它页面。
+网页向应用发送消息。注意:小程序端应用会在此页面后退时接收到消息。
+t |