Compare commits

...

2 Commits

Author SHA1 Message Date
ryx 15097de339 完成合并:保留本地新增/修改文件,同步远程历史 2026-01-27 01:10:41 +08:00
ryx 45d9d9fd1c 2026.1.27修改 2026-01-27 00:52:00 +08:00
20 changed files with 2699 additions and 542 deletions

View File

@ -112,34 +112,18 @@ https://ciyon.ciy.cn/
https://ciyon.ciy.cn/admin/ https://ciyon.ciy.cn/admin/
# Windows开发环境部署 # 环境部署建议
安装环境: Nginx、PHP8、MariaDB10、Golang
开发必备: Git、VSCode(Cursor、Claude Code等替代)、HBuilder、微信开发者工具
开发推荐: Navicat 17+、WinSCP5+、Chrome、Apifox、S3 Browser、Node.js
工具推荐: Notepad3、draw.io、XMind、Everything
nginx关键配置(PHP): 安装Nginx
server { 统一处理80/443端口
listen 443 ssl http2;
server_name ciyon.local.ciy.cn;
root D:/Dreams/ciy/ciyon/web;
include ssl_params;
include ciyon5_params;
}
nginx关键配置(Golang): 安装MariaDB数据库
server { 开启慢查询日志
listen 443 ssl http2;
server_name ciyongo.local.ciy.cn;
root D:/Dreams/ciy/ciyon/web;
include ssl_params;
set $ipport http://127.0.0.1:4003;
include ciyon5go_params;
}
*.local.ciy.cn SSL证书下载 https://ciyon.ciy.cn/ud/install/ssl_local.zip PHP需配置PHP-fpm建议用PHP8
webserver打包下载 https://ciyon.ciy.cn/ud/install/webserver.zip
mariadb下载 https://ciyon.ciy.cn/ud/install/mariadb-10.5.10-winx64.msi
# Linux生产环境部署 Golang虽然可以独立运行但建议Nginx转发
IDE开发工具
PC端推荐用VSCode、Cursor
移动端推荐用Uniapp、VSCode

File diff suppressed because it is too large Load Diff

View File

@ -34,12 +34,20 @@
// selecticon: svg.replaceAll(/{{bg1}}/g, bgsel1).replaceAll(/{{bg2}}/g, bgsel2), // selecticon: svg.replaceAll(/{{bg1}}/g, bgsel1).replaceAll(/{{bg2}}/g, bgsel2),
// icon: svg.replaceAll(/{{bg1}}/g, bggray1).replaceAll(/{{bg2}}/g, bggray2) // icon: svg.replaceAll(/{{bg1}}/g, bggray1).replaceAll(/{{bg2}}/g, bggray2)
// }); // });
var svg = '<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M207,110h614c109,0,197,88,197,197v416c0,109-88,197-197,197H207c-109,0-197-88-197-197V308C9,198,97,110,207,110z" fill="{{bg2}}"></path><path d="M865,819H118c-10,0-19-9-19-19c0-3,1-7,2-10l26-35c3-6,10-9,17-9h748c10,0,19,9,19,19c0,3-1,7-2,10l-26,35C878,815,872,819,865,819z M451,285c0-8-6-14-14-14h-246c-8,0-14,6-14,14v246c0,8,6,14,14,14h246c8,0,14-6,14-14V285z M909,503c0-8-6-14-14-14H562c-8,0-14,6-14,14v25c0,8,6,14,14,14h333c8,0,14-6,14-14V503z" fill="{{bg1}}"></path></svg>'; // var svg = '<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M207,110h614c109,0,197,88,197,197v416c0,109-88,197-197,197H207c-109,0-197-88-197-197V308C9,198,97,110,207,110z" fill="{{bg2}}"></path><path d="M865,819H118c-10,0-19-9-19-19c0-3,1-7,2-10l26-35c3-6,10-9,17-9h748c10,0,19,9,19,19c0,3-1,7-2,10l-26,35C878,815,872,819,865,819z M451,285c0-8-6-14-14-14h-246c-8,0-14,6-14,14v246c0,8,6,14,14,14h246c8,0,14-6,14-14V285z M909,503c0-8-6-14-14-14H562c-8,0-14,6-14,14v25c0,8,6,14,14,14h333c8,0,14-6,14-14V503z" fill="{{bg1}}"></path></svg>';
// app.globalData.tabbarArr.push({
// name: 'tabbar.cd',
// fullpath: '/pages/card',
// selecticon: svg.replaceAll(/{{bg1}}/g, bgsel1).replaceAll(/{{bg2}}/g, bgsel2),
// icon: svg.replaceAll(/{{bg1}}/g, bggray1).replaceAll(/{{bg2}}/g, bggray2)
// });
// SVG{{bg1}}/{{bg2}}
var svg = '<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M512.3 79.6c-243 0-440 165.9-440 370.5 0 122.6 70.7 231.3 179.7 298.8 12.2 7.5 19.1 21.3 18.1 35.6L259 939c-0.7 9.2 8.8 15.8 17.3 12L543 828.9c16.1-7.4 33.3-11.8 50.8-14.6 204.1-32.2 358.5-183 358.5-364.2 0-204.7-197-370.5-440-370.5z" fill="{{bg2}}"></path><path d="M256.2 511.1c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.6 64-64 64z m256.1 0c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64z m256 3.4c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.6 64-64 64z" fill="{{bg1}}"></path></svg>';
app.globalData.tabbarArr.push({ app.globalData.tabbarArr.push({
name: 'tabbar.notify', name: 'tabbar.message',
fullpath: '/pages/main/notify', fullpath: '/pages/main/message',
selecticon: svg.replaceAll(/{{bg1}}/g, bgsel1).replaceAll(/{{bg2}}/g, bgsel2), selecticon: svg.replaceAll(/{{bg1}}/g, bgsel1).replaceAll(/{{bg2}}/g, bgsel2),
icon: svg.replaceAll(/{{bg1}}/g, bggray1).replaceAll(/{{bg2}}/g, bggray2) icon: svg.replaceAll(/{{bg1}}/g, bggray1).replaceAll(/{{bg2}}/g, bggray2)
}); });
var svg = '<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M706,460c64-38,107-104,107-179c0-118-106-213-237-213c-131,0-237,95-237,213c0,75,43,141,107,179c-181,51-311,206-311,385c0,39,35,70,78,70H938c43,0,78-32,78-70v-5C1017,661,886,511,706,460L706,460z" fill="{{bg1}}"/><path d="M580,472c64-42,107-115,107-197c0-131-106-237-237-237c-131,0-237,106-237,237c0,83,43,155,107,199c-181,57-311,228-311,427c0,43,14,76,57,76l745,1c43,0,78-35,78-78v-6C891,696,761,528,580,472L580,472z" fill="{{bg2}}"/></svg>'; var svg = '<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M706,460c64-38,107-104,107-179c0-118-106-213-237-213c-131,0-237,95-237,213c0,75,43,141,107,179c-181,51-311,206-311,385c0,39,35,70,78,70H938c43,0,78-32,78-70v-5C1017,661,886,511,706,460L706,460z" fill="{{bg1}}"/><path d="M580,472c64-42,107-115,107-197c0-131-106-237-237-237c-131,0-237,106-237,237c0,83,43,155,107,199c-181,57-311,228-311,427c0,43,14,76,57,76l745,1c43,0,78-35,78-78v-6C891,696,761,528,580,472L580,472z" fill="{{bg2}}"/></svg>';
app.globalData.tabbarArr.push({ app.globalData.tabbarArr.push({
@ -57,7 +65,7 @@
app.globalData.srv = 't'; app.globalData.srv = 't';
app.globalData.jsnajax = 'ambap/'; app.globalData.jsnajax = 'ambap/';
app.globalData.jsnurl = {}; app.globalData.jsnurl = {};
app.globalData.jsnurl.t = 'https://labsci.ciy.cn/'; app.globalData.jsnurl.t = 'https://labsci.local.ciy.cn/';
app.globalData.demourl = 'https://i.qiboc.cn/app.goc'; // app.globalData.demourl = 'https://i.qiboc.cn/app.goc'; //
app.globalData.tokenfield = "ciyap"; app.globalData.tokenfield = "ciyap";
app.globalData.tokensalt = "ast34h$3"; app.globalData.tokensalt = "ast34h$3";
@ -67,7 +75,7 @@
app.globalData.dupsec = 60; app.globalData.dupsec = 60;
app.globalData.storselect = '/'; app.globalData.storselect = '/';
app.globalData.storlist = { app.globalData.storlist = {
'/': 'https://labsci.ciy.cn/ud/', '/': 'https://labsci.local.ciy.cn/ud/',
'A': 'https://cf5.nyyzsoft.cn/ud/' 'A': 'https://cf5.nyyzsoft.cn/ud/'
}; };
app.globalData.stortransfer = ['/']; app.globalData.stortransfer = ['/'];

View File

@ -1,7 +1,6 @@
<template> <template>
<view :animation="anidataauth" class="auth"> <view :animation="anidataauth" class="auth">
<view class="swiper" :style="{transform: 'translateX(' + pg + 'vw)',height:height}"> <view class="swiper" :style="{transform: 'translateX(' + pg + 'vw)',height:height}">
<!-- 注册页面 -->
<view class="content"> <view class="content">
<view class="title"> <view class="title">
<ciy-gesture @toleft="gopg(1)" class="mid" style="letter-spacing: 1em;">{{lang('login.tabreg')}}</ciy-gesture> <ciy-gesture @toleft="gopg(1)" class="mid" style="letter-spacing: 1em;">{{lang('login.tabreg')}}</ciy-gesture>
@ -43,7 +42,6 @@
</form> </form>
</view> </view>
<!-- 登录页面 -->
<view class="content"> <view class="content">
<view class="title"> <view class="title">
<view @tap="gopg(0)" style="padding-right:2em;">{{lang('login.tabreg')}}</view> <view @tap="gopg(0)" style="padding-right:2em;">{{lang('login.tabreg')}}</view>
@ -87,7 +85,6 @@
</form> </form>
</view> </view>
<!-- 忘记密码页面 -->
<view class="content"> <view class="content">
<view class="title"> <view class="title">
<view @tap="gopg(0)">{{lang('login.tabreg')}}</view> <view @tap="gopg(0)">{{lang('login.tabreg')}}</view>
@ -105,7 +102,7 @@
<view class="ciy-form"> <view class="ciy-form">
<label>验证码</label> <label>验证码</label>
<view> <view>
<ciy-capcode hasmore name="captcha" btntxt="发送短信" :account="forgetmobile" :func="smsfunc" placeholder="请输入验证码"></ciy-capcode> <ciy-capcode hasmore name="capsms" btntxt="发送短信" :account="forgetmobile" :func="smsfunc" placeholder="请输入验证码"></ciy-capcode>
</view> </view>
</view> </view>
<view class="ciy-form"> <view class="ciy-form">
@ -171,6 +168,7 @@
.auth { .auth {
position: fixed; position: fixed;
z-index: 50002; z-index: 50002;
/*51*/
bottom: -2em; bottom: -2em;
left: 0; left: 0;
right: 0; right: 0;
@ -180,6 +178,7 @@
.authbg { .authbg {
position: fixed; position: fixed;
z-index: 50001; z-index: 50001;
/*50*/
top: 0; top: 0;
bottom: 0; bottom: 0;
left: -0.5em; left: -0.5em;
@ -205,7 +204,6 @@
box-shadow: 2px 2px 20px -10px var(--bg9); box-shadow: 2px 2px 20px -10px var(--bg9);
} }
</style> </style>
<script> <script>
import md5 from '@/util/md5.js'; import md5 from '@/util/md5.js';
export default { export default {
@ -217,7 +215,7 @@
user: '', user: '',
pass: '', pass: '',
xieyi: false, xieyi: false,
pg: -100, pg: -100, //-100
ver: 6, ver: 6,
height: '28em', height: '28em',
tusers: [], tusers: [],
@ -228,9 +226,10 @@
options: { options: {
virtualHost: true virtualHost: true
}, },
watch: {},
computed: {},
mounted() {}, mounted() {},
methods: { methods: {
//
async Open(authcb, must) { async Open(authcb, must) {
this.authcb = authcb; this.authcb = authcb;
if (!must) { if (!must) {
@ -250,7 +249,7 @@
onlyAuthorize: true onlyAuthorize: true
}); });
var retjson = await this.callfunc({ var retjson = await this.callfunc({
func: 'login.json_wx_autouser', func: 'login.wx_autouser',
loadhide: true, loadhide: true,
data: { data: {
code: res.code, code: res.code,
@ -263,7 +262,6 @@
return; return;
//#endif //#endif
} }
//
var animation = uni.createAnimation({ var animation = uni.createAnimation({
timingFunction: 'ease' timingFunction: 'ease'
}); });
@ -272,7 +270,6 @@
duration: 700 duration: 700
}); });
this.anidataauth = animation.export(); this.anidataauth = animation.export();
var animation = uni.createAnimation({ var animation = uni.createAnimation({
timingFunction: 'ease' timingFunction: 'ease'
}); });
@ -281,16 +278,12 @@
duration: 400 duration: 400
}); });
this.anidatabg = animation.export(); this.anidatabg = animation.export();
this.user = this.getstorage('login_mb'); this.user = this.getstorage('login_mb');
this.smsfunc = 'login.json_sendsms'; this.smsfunc = 'login.sendsms';
}, },
//
async submitlogin(e) { async submitlogin(e) {
var app = getApp(); var app = getApp();
var post = e.detail.value; var post = e.detail.value;
if (post.user.length > 0) if (post.user.length > 0)
this.setstorage('login_mb', post.user); this.setstorage('login_mb', post.user);
if (post.user == '') if (post.user == '')
@ -299,33 +292,23 @@
return this.toast('请填写密码'); return this.toast('请填写密码');
if (!this.xieyi && await this.askmsg('是否阅读并同意协议?', '同意') != 'ok') if (!this.xieyi && await this.askmsg('是否阅读并同意协议?', '同意') != 'ok')
return; return;
//
post.auth = (new Date()).getTime(); post.auth = (new Date()).getTime();
post.appcid = app.globalData._appcid; post.appcid = app.globalData._appcid;
var epass = md5.md5(post.pass + app.globalData.tokensalt);
// md5(MD5 + auth) post.pass = md5.md5(epass + post.auth);
var userPassMd5 = md5.md5(post.pass); //._from = app.globalData._sysinfo;
post.pass = md5.md5(userPassMd5 + post.auth);
//
var retjson = await this.callfunc({ var retjson = await this.callfunc({
func: 'login.json_login_mobile', func: 'login.login_mobile', // login.login
data: post data: post
}); });
if (retjson.code != 1) if (retjson.code != 1)
return this.toast(retjson.errmsg); return this.toast(retjson.errmsg);
this.setstorage('_dbgs', retjson.dbgs); this.setstorage('_dbgs', retjson.dbgs);
this.tologin(retjson); this.tologin(retjson);
}, },
//
async submitreg(e) { async submitreg(e) {
var app = getApp(); var app = getApp();
var post = e.detail.value; var post = e.detail.value;
if (post.user == '') if (post.user == '')
return this.toast('请填写手机号'); return this.toast('请填写手机号');
if (post.pass == '') if (post.pass == '')
@ -334,32 +317,24 @@
return this.toast('两次密码输入不同'); return this.toast('两次密码输入不同');
if (!this.xieyi && await this.askmsg('是否阅读并同意协议?', '同意') != 'ok') if (!this.xieyi && await this.askmsg('是否阅读并同意协议?', '同意') != 'ok')
return; return;
post.upid = app.getstorage('upid'); post.upid = app.getstorage('upid');
post.appcid = app.globalData._appcid; post.appcid = app.globalData._appcid;
// MD5() post.pass = md5.md5(post.pass + app.globalData.tokensalt);
post.pass = md5.md5(post.pass);
post.pass2 = ''; post.pass2 = '';
//._from = app.globalData._sysinfo;
//
var retjson = await this.callfunc({ var retjson = await this.callfunc({
func: 'login.json_reg_mobile', func: 'login.reg_mobile', // login.reg
data: post data: post
}); });
if (retjson.code != 1) if (retjson.code != 1)
return this.toast(retjson.errmsg); return this.toast(retjson.errmsg);
this.setstorage('login_mb', post.user); this.setstorage('login_mb', post.user);
this.tologin(retjson); this.tologin(retjson);
this.toast('注册成功,已自动登录'); this.toast('注册成功,已自动登录');
}, },
//
async submitforget(e) { async submitforget(e) {
var app = getApp(); var app = getApp();
var post = e.detail.value; var post = e.detail.value;
if (post.user == '') if (post.user == '')
return this.toast('请填写手机号'); return this.toast('请填写手机号');
if (post.captcha == '') if (post.captcha == '')
@ -368,24 +343,16 @@
return this.toast('请填写密码'); return this.toast('请填写密码');
if (post.pass != post.pass2) if (post.pass != post.pass2)
return this.toast('两次密码输入不同'); return this.toast('两次密码输入不同');
post.pass = md5.md5(post.pass + app.globalData.tokensalt);
// MD5()
post.pass = md5.md5(post.pass);
//
var retjson = await this.callfunc({ var retjson = await this.callfunc({
func: 'login.json_forgetpass', func: 'login.forgetpass', // login.reg
data: post data: post
}); });
if (retjson.code != 1) if (retjson.code != 1)
return this.toast(retjson.errmsg); return this.toast(retjson.errmsg);
this.tologin(retjson); this.tologin(retjson);
this.toast('密码找回成功,已自动登录'); this.toast('密码找回成功,已自动登录');
}, },
//
tologin(json) { tologin(json) {
var app = getApp(); var app = getApp();
var auth = app.setuserstorage(json); var auth = app.setuserstorage(json);
@ -394,13 +361,9 @@
this.authcb = null; this.authcb = null;
this.close(); this.close();
}, },
//
gopg(idx) { gopg(idx) {
this.pg = idx * -100; this.pg = idx * -100;
}, },
//
close() { close() {
if (this.authcb != null) if (this.authcb != null)
this.authcb({ this.authcb({
@ -409,7 +372,6 @@
} }
}); });
this.authcb = null; this.authcb = null;
var animation = uni.createAnimation({ var animation = uni.createAnimation({
timingFunction: 'ease' timingFunction: 'ease'
}); });
@ -418,7 +380,6 @@
duration: 1000 duration: 1000
}); });
this.anidataauth = animation.export(); this.anidataauth = animation.export();
var animation = uni.createAnimation({ var animation = uni.createAnimation({
timingFunction: 'ease' timingFunction: 'ease'
}); });
@ -428,8 +389,6 @@
}); });
this.anidatabg = animation.export(); this.anidatabg = animation.export();
}, },
//
async showver(e) { async showver(e) {
this.ver--; this.ver--;
if (this.ver !== 0) if (this.ver !== 0)
@ -437,94 +396,17 @@
var app = getApp(); var app = getApp();
if (app.globalData._wxenv == 'release') if (app.globalData._wxenv == 'release')
return; return;
var retjson = await this.callfunc({ var retjson = await this.callfunc({
func: 'login.json_debug_list', func: 'login.debug_list',
data: {} data: {}
}); });
this.tusers = retjson.list; this.tusers = retjson.list;
}, },
//
setdbg(idx) { setdbg(idx) {
this.xieyi = true; this.xieyi = true;
this.user = this.tusers[idx].user; this.user = this.tusers[idx].user;
this.pass = this.tusers[idx].pass; this.pass = this.tusers[idx].pass;
}, },
//
getme() {
return uni.getStorageSync('me') || {id: 0};
},
//
getstorage(key) {
return uni.getStorageSync(key) || '';
},
//
setstorage(key, value) {
uni.setStorageSync(key, value);
},
//
toint(val) {
return parseInt(val) || 0;
},
//
toast(msg) {
uni.showToast({
title: msg,
icon: 'none',
duration: 2000
});
},
//
askmsg(content, confirmText = '确定') {
return new Promise((resolve) => {
uni.showModal({
title: '提示',
content: content,
confirmText: confirmText,
success: (res) => {
resolve(res.confirm ? 'ok' : 'cancel');
}
});
});
},
//
async callfunc(options) {
return new Promise((resolve) => {
uni.request({
url: 'http://localhost:5173/ambap/login.php', //
method: 'POST',
data: {
act: options.func,
...options.data
},
success: (res) => {
resolve(res.data || {code: 0, errmsg: '接口返回异常'});
},
fail: (err) => {
this.toast('网络请求失败');
resolve({code: 0, errmsg: '网络错误'});
}
});
});
},
//
gourl(e) {
var url = e.currentTarget.dataset.url;
if (url) {
uni.navigateTo({
url: url
});
}
}
} }
} }
</script> </script>

View File

@ -227,18 +227,19 @@
}, },
computed: { computed: {
tvalue() { tvalue() {
var v = this.val; // this.val null/undefined
var ret = {}; var v = this.val || '';
ret.value = v; var ret = {};
var pimgs = v.split('~'); ret.value = v;
ret.imgs = []; var pimgs = v.split('~'); // vnullsplit
for (var i in pimgs) { ret.imgs = [];
if (!pimgs[i]) for (var i in pimgs) {
continue; if (!pimgs[i])
ret.imgs.push(pimgs[i]); continue;
} ret.imgs.push(pimgs[i]);
return ret; }
} return ret;
}
}, },
mounted() { mounted() {
var app = getApp(); var app = getApp();

View File

@ -18,8 +18,17 @@
"pagePath": "pages/main/index" "pagePath": "pages/main/index"
}, },
{ {
<<<<<<< HEAD
"pagePath": "pages/main/message"
},
{
"pagePath": "pages/main/me" "pagePath": "pages/main/me"
} }
=======
"pagePath": "pages/main/me"
}
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
] ]
}, },
"preloadRule": { "preloadRule": {

View File

@ -7,13 +7,22 @@
} }
}, },
{ {
<<<<<<< HEAD
"path": "pages/main/me",
=======
"path": "pages/main/notify", "path": "pages/main/notify",
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
"style": { "style": {
"enablePullDownRefresh": true "enablePullDownRefresh": true
} }
}, },
<<<<<<< HEAD
{
"path": "pages/main/message",
=======
{ {
"path": "pages/main/me", "path": "pages/main/me",
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
"style": { "style": {
"enablePullDownRefresh": true "enablePullDownRefresh": true
} }
@ -58,7 +67,11 @@
"pagePath": "pages/main/index" "pagePath": "pages/main/index"
}, },
{ {
<<<<<<< HEAD
"pagePath": "pages/main/message"
=======
"pagePath": "pages/main/notify" "pagePath": "pages/main/notify"
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
}, },
{ {
"pagePath": "pages/main/me" "pagePath": "pages/main/me"
@ -412,6 +425,20 @@
] ]
}, },
{ {
<<<<<<< HEAD
"root": "pages/lab",
"pages": [
{
"path": "user_list"
},
{
"path": "user_edit"
}
]
}
=======
"root": "pages/lab", "root": "pages/lab",
"pages": [ "pages": [
{ {
@ -422,5 +449,6 @@
} }
] ]
} }
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
] ]
} }

View File

@ -0,0 +1,287 @@
<template>
<ciy-header title="新增/编辑页" ref="header"></ciy-header>
<view v-if="init.code != 1">
<view class="px4 py4">
<view style="height:2em;width:60%;" class="ciy-skeleton"></view>
<view style="height:1em;width:40%;margin-left:1em;" class="ciy-skeleton"></view>
<view style="height:1em;width:50%;" class="ciy-skeleton"></view>
<view style="height:6em;width:100%;" class="ciy-skeleton"></view>
</view>
</view>
<view v-else>
<view class="ciy-form-group">
<view class="ciy-form">
<label class="imp">默认标题</label>
<view>
<ciy-input name="name" v-model="editdata.name"></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>所属菜单</label>
<view>
<ciy-select :range="g.zc_menu" name="menuid" v-model="editdata.menuid"></ciy-select>
</view>
</view>
<view class="ciy-form">
<label>文件大小</label>
<view>
<ciy-inputbet bet="1024" unit="KB" name="filesize" v-model="editdata.filesize"></ciy-inputbet>
</view>
</view>
<view class="ciy-form">
<label>长度</label>
<view>
<ciy-inputbet bet="1000" unit="米" :ciystyle="{width:'8em'}" name="metre" v-model="editdata.metre"></ciy-inputbet>
</view>
</view>
<view class="ciy-form">
<label>贷款金额</label>
<view>
<ciy-inputbet bet="1000000" unit="万元" name="bankmoney" v-model="editdata.bankmoney"></ciy-inputbet>
</view>
</view>
<view class="ciy-form">
<label>设置日期</label>
<view>
<ciy-inputdatetime name="setdate" v-model="editdata.setdate"></ciy-inputdatetime>
</view>
</view>
<view class="ciy-form">
<label>设置时间</label>
<view>
<ciy-inputdatetime btime name="settimes" v-model="editdata.settimes"></ciy-inputdatetime>
</view>
</view>
<view class="ciy-form">
<label>营业时间</label>
<view>
<ciy-inputtimepoint bsec name="dayclock" v-model="editdata.dayclock"></ciy-inputtimepoint>
</view>
</view>
<view class="ciy-form">
<label>文档</label>
<view>
<ciy-upload num="5" filetype="all" imgwidth="1000" sourcetype="album,message" path="demo" name="downurl" v-model="editdata.downurl"></ciy-upload>
</view>
</view>
<view class="ciy-form">
<label>头像</label>
<view>
<ciy-upload imgwidth="600" imgheight="600" path="demo" name="avar" v-model="editdata.avar"></ciy-upload>
</view>
</view>
<view class="ciy-form">
<label>是否使用</label>
<view>
<ciy-selbool name="isuse" v-model="editdata.isuse"></ciy-selbool>
</view>
</view>
<view class="ciy-form">
<label>是否开启</label>
<view>
<ciy-selbool y="开启" n="关闭" name="isopen" v-model="editdata.isopen"></ciy-selbool>
</view>
</view>
<view class="ciy-form">
<label>库存单位</label>
<view>
<ciy-inputunitedit name="unit" v-model="editdata.unit"></ciy-inputunitedit>
</view>
</view>
<view class="ciy-form">
<label>单选状态</label>
<view>
<ciy-radio left :range="g.auditstatus" name="sigstatus" v-model="editdata.sigstatus"></ciy-radio>
</view>
</view>
<view class="ciy-form">
<label>多选状态</label>
<view>
<ciy-checkbox itemright line :range="g.auditstatus" name="mauditstatus" v-model="editdata.mauditstatus"></ciy-checkbox>
</view>
</view>
<view class="ciy-form">
<label>组织结构</label>
<view>
<ciy-selcas :range="g.zc_depart" name="prodcata" v-model="editdata.prodcata"></ciy-selcas>
</view>
</view>
<view class="ciy-form">
<label>所在地区</label>
<view>
<ciy-selcas :range="g.ciy_arearpc" name="areacode" v-model="editdata.areacode"></ciy-selcas>
</view>
</view>
<view class="ciy-form">
<label>认证情况</label>
<view>
<ciy-checkbox bin left line :range="g.renzheng" name="renzheng" v-model="editdata.renzheng"></ciy-checkbox>
</view>
</view>
<view class="ciy-form">
<label>临时字典</label>
<view>
<ciy-select :range="g.ppint" name="ppint" v-model="editdata.ppint"></ciy-select>
</view>
</view>
<view class="ciy-form">
<label>执行周期</label>
<view>
<ciy-inputcyc name="npcyc" v-model="editdata.npcyc"></ciy-inputcyc>
</view>
</view>
<view class="ciy-form">
<label>执行用时</label>
<view>
<ciy-input name="runsec" v-model="editdata.runsec"></ciy-input>
</view>
<view style="flex:none;"></view>
</view>
<view class="ciy-form">
<label>活动期数</label>
<view class="flex flex-center" style="justify-content: flex-end;">
<ciy-input :ciystyle="{width:'3em',margin:'0 0.5em',textAlign:'center',display:'inline-block'}" name="acttm" v-model="editdata.acttm"></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>活动花絮</label>
<view>
<ciy-upload num="9" imgwidth="1920" zipjpg="80" path="demo" name="imgs" v-model="editdata.imgs"></ciy-upload>
</view>
</view>
<view class="ciy-form">
<label>吨位</label>
<view>
<ciy-inputbet bb bet="1000000" unit="吨" :ciystyle="{width:'8em'}" name="ton" v-model="editdata.ton"></ciy-inputbet>
</view>
</view>
<view class="ciy-form">
<label>单价</label>
<view>
<ciy-inputbet bet="100" unit="元" name="price" v-model="editdata.price"></ciy-inputbet>
</view>
</view>
<view class="ciy-form">
<label>位置</label>
<view>
<ciy-selmap name="loc" v-model:lng="editdata.lng" v-model:lat="editdata.lat"></ciy-selmap>
</view>
</view>
<view class="ciy-form">
<label>百分比</label>
<view>
<ciy-inputbet bet="100" unit="%" name="pct" v-model="editdata.pct"></ciy-inputbet>
</view>
</view>
<view class="ciy-form">
<label>链接</label>
<view>
<ciy-input name="url" v-model="editdata.url"></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>体重</label>
<view>
<ciy-inputbet bet="1000" unit="公斤" name="weightg" v-model="editdata.weightg"></ciy-inputbet>
</view>
</view>
<view class="ciy-form">
<label>耳温</label>
<view>
<ciy-inputbet bet="1000" unit="℃" name="eartmpr" v-model="editdata.eartmpr"></ciy-inputbet>
</view>
</view>
<view class="ciy-form">
<label>身份证号</label>
<view>
<ciy-input name="idcard" v-model="editdata.idcard"></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>介绍</label>
<view>
<ciy-textarea name="content" v-model="editdata.content"></ciy-textarea>
</view>
</view>
<!-- <view class="ciy-form v">
<label>富文本</label>
<view>
<ciy-mdedit name="md" v-model="editdata.md"></ciy-mdedit>
</view>
</view> -->
</view>
<view class="tabbar ciy-bottom">
<button class="btn lg cc long" @tap="edited">{{lang('page.btn_submit')}}</button>
</view>
</view>
</template>
<style>
</style>
<script>
export default {
props: ['id'],
data() {
return {}
},
onLoad() {
if (!this.pagedata.demo)
return this.alert('不能直接访问,请重新进入'); //
this.editdata = {...this.pagedata.demo};
this.getdata();
},
watch: {},
computed: {},
methods: {
async getdata() {
var act = 'edit';
var page = getApp().getpage(1);
if (page && page.init._editonce)
act = '';
if (this._loading)
return;
this._loading = true;
var retjson = await this.callfunc({
func: 'demo/demo.getdata',
data: {
...this.opn,
act: act
}
});
this._loading = false;
if (retjson.code != 1)
return this.init = retjson;
if (act == 'edit') {
page.init._editonce = true;
page.g.zc_menu = retjson.zc_menu;
this.g.zc_menu = retjson.zc_menu;
}
this.init = this.objdeepmerge(this.init, retjson);
},
async edited() {
if (this._loading)
return;
this._loading = true;
var retjson = await this.callfunc({
func: 'demo/demo.update',
data: {
...this.editdata
}
});
this._loading = false;
if (retjson.code != 1)
return this.alert(retjson.errmsg);
var page = getApp().getpage(1);
if (page?.init?.list)
this.objtolist(page.init.list, retjson.data);
// const eventChannel = this.getOpenerEventChannel();
// eventChannel.emit('writedata', retjson.data);
uni.navigateBack();
}
}
}
</script>

View File

@ -0,0 +1,331 @@
<template>
<ciy-header title="搜索/列表/删除页" ref="header"></ciy-header>
<view v-if="init.code != 1">
<view class="px4 py4">
<view style="height:2em;width:60%;" class="ciy-skeleton"></view>
<view style="height:1em;width:40%;margin-left:1em;" class="ciy-skeleton"></view>
<view style="height:1em;width:50%;" class="ciy-skeleton"></view>
<view style="height:6em;width:100%;" class="ciy-skeleton"></view>
</view>
</view>
<view v-else>
<view class="sti" :style="{top:(header_statusbar_height+header_title_height)+'px'}">
<ciy-segment :lis="init.lis" all="全部" @change="segment_change"></ciy-segment>
<ciy-query ref="query" :gdict="g" :qry="init.searchinput" @confirm="query_confirm">
<template v-slot="{itm}">
<ciy-input :name="itm.item.form" v-model="itm.data[itm.item.form]"></ciy-input>
</template>
</ciy-query>
</view>
<view class="ciy-list" :class="{del:item._del}" v-for="(item,index) in init.list" :key="item.id" @tap="showmenu(index)">
<view class="l0">No: {{item.id}}</view>
<view v-if="item.id%2 == 0" class="rt">
<view class="code b" :class="ccode(g.auditstatus, item.auditstatus,'clas')">{{ccode(g.auditstatus, item.auditstatus)}}</view>
</view>
<view v-else class="rtz liner" :class="ccode(g.auditstatus, item.auditstatus,'clas')">
{{ccode(g.auditstatus, item.auditstatus)}}
</view>
<view class="l1 c">
<view>{{item.name}}</view>
</view>
<view class="ciy-hr"></view>
<view class="l2">审核人 {{ccode('xa_user', item.audituser)}}</view>
<view class="l2" v-if="item.auditmsg">审核理由 <text v-html="tobr(item.auditmsg)"></text></view>
<view class="l2">审核时间 {{todatetime(item.audittimes)}}</view>
<view class="ciy-hr"></view>
<view class="l2">
<label>所属菜单</label>
<view>{{ccode(init.zc_menu, item.menuid)}}</view>
</view>
<view class="l2">
<label>文件大小</label>
<view>{{tofix(item.filesize/1024, -2)}}KB</view>
</view>
<view class="l2">
<label>长度</label>
<view>{{tofix(item.metre/1000, -2)}}</view>
</view>
<view class="l2">
<label>贷款金额</label>
<view>{{tofix(item.bankmoney/1000000)}}万元</view>
</view>
<view class="l2">
<label>设置日期</label>
<view>{{todatetime(item.setdate, 'd')}}</view>
</view>
<view class="l2">
<label>设置时间</label>
<view>{{todatetime(item.settimes)}}</view>
</view>
<view class="l2">
<label>营业时间</label>
<view>{{totimepoint(item.dayclock, true)}}</view>
</view>
<ciy-showimgs label="文档" :src="item.downurl"></ciy-showimgs>
<ciy-showimgs :src="item.avar" width="20em" mode="widthFix"></ciy-showimgs>
<view class="l2">
<label>是否使用</label>
<view>{{item.isuse==1?'√':'×'}}</view>
</view>
<view class="l2">
<label>是否开启</label>
<view>{{item.isopen==1?'开启':'关闭'}}</view>
</view>
<view class="l2">
<label>库存单位</label>
<view>{{tounit(item.unit)}}</view>
</view>
<view class="l2">
<label>单选状态</label>
<view>{{ccode(g.auditstatus, item.sigstatus)}}</view>
</view>
<view class="l2">
<label>多选状态</label>
<view>
<view class="kbd" v-for="(itm, index) in scode(g.auditstatus, item.mauditstatus)" :key="index">{{itm.name}}</view>
</view>
</view>
<view class="l2">
<label>组织结构</label>
<view>{{mcode(g.zc_depart, item.prodcata, 'name').join(' . ')}}</view>
</view>
<view class="l2">
<label>所在地区</label>
<view>
<text class="code" v-for="(itm, index) in mcode(g.ciy_arearpc, item.areacode)" :key="index">{{itm.name}}</text>
</view>
</view>
<view class="l2">
<label>认证情况</label>
<view>
<text class="kbd" v-for="(itm, index) in bcode(g.renzheng, item.renzheng)" :key="index">{{itm.name}}</text>
</view>
</view>
<view class="l2">
<label>临时字典</label>
<view>{{ccode(g.ppint, item.ppint)}}</view>
</view>
<view class="l2">
<label>执行周期</label>
<view>{{tocyc(item.npcyc)}}</view>
</view>
<view class="l2">
<label>执行用时</label>
<view>{{totimesec(item.runsec)}}</view>
</view>
<view class="l2">
<label>活动期数</label>
<view>{{item.acttm}}</view>
</view>
<ciy-showimgs label="活动花絮" :src="item.imgs"></ciy-showimgs>
<view class="l2">
<label>吨位</label>
<view>{{tofix(item.ton/1000000, 3)}}</view>
</view>
<view class="l2">
<label>单价</label>
<view>{{tofix(item.price/100, 2)}}</view>
</view>
<view class="l2">
<label>位置</label>
<view><text style="text-decoration: underline;" @tap.stop="goloc(item.lat, item.lng)">查看位置</text>
</view>
</view>
<view class="l2">
<label>百分比</label>
<view>{{tofix(item.pct/100, 2)}}%</view>
</view>
<view class="l2">
<label>链接</label>
<view><text style="text-decoration: underline;" @tap.stop="goweb(item.url)">转到链接</text>
</view>
</view>
<view class="l2">
<label>体重</label>
<view>{{tofix(item.weightg/1000)}}公斤</view>
</view>
<view class="l2">
<label>耳温</label>
<view>{{tofix(item.eartmpr/1000, 1)}}</view>
</view>
<view class="l2">
<label>身份证号</label>
<view>{{tomsk(item.idcard,'******#*')}}</view>
</view>
<view class="rb">
添加时间 {{todatetime(item.addtimes)}}
</view>
</view>
<ciy-listend :page="pageno" :listlen="init.list.length" :nodataimg="file_stor('/img/mbnone.png')"></ciy-listend>
<view class="ciy-add" @tap="edit()"></view>
</view>
</template>
<style>
</style>
<script>
export default {
data() {
return {}
},
onLoad() {
this.load_ciydict(this.file_stor('/dict/ciy_arearpc.js')).then(json => {
if (json.code != 1)
return this.alert(json.errmsg);
this.g.ciy_arearpc = json.arr;
});
this.getlist();
},
onReachBottom(b) {
console.log('onReachBottom page', this.pageno);
if (this.init.code != 1)
return;
this.getlist();
},
onPullDownRefresh(b) {
console.log('onPullDownRefresh page');
this.pageno = 0;
this._stopPullDown = true;
this.getlist();
},
watch: {},
computed: {},
methods: {
async getlist() {
if (this.pageno < 0)
return;
if (this._loading)
return;
this.pagepost.pageno = this.pageno + 1;
this.pagepost.once = !this.init.once;
this._loading = true;
var retjson = await this.callfunc({
func: 'demo/demo.list',
data: this.pagepost
});
this._loading = false;
if (retjson.code != 1)
return this.alert(retjson.errmsg);
this.pageno++;
if (this.pageno == 1)
this.init.list = [];
this.init = this.objdeepmerge(this.init, retjson);
if (retjson.once) {
this.init.lis = [...this.g.auditstatus];
this.g.zc_depart = retjson.zc_depart;
this.g.ppint = retjson.ppint;
}
this.getrefs('query').then(ref => {
ref.setdata(retjson.where);
});
if (retjson.list.length < retjson.pagecount)
this.pageno = -1;
},
segment_change(e) {
this.pagepost.liid = e.value.id;
this.pageno = 0;
this.getlist();
uni.pageScrollTo({
scrollTop: 0,
duration: 800
});
},
query_confirm(dat) {
this.pagepost.query = dat;
this.pageno = 0;
this.getlist();
uni.pageScrollTo({
scrollTop: 0,
duration: 800
});
},
async edit(item) {
item = item || {
url: '',
data: {
id: 0,
_idx: -1
}
};
this.gourl('user_edit?id=' + item.data.id, 'navigate', item.data, 'lab');
},
async del(item) {
if (await this.askmsg('是否删除?', '删除') != 'ok')
return;
var retjson = await this.callfunc({
func: 'demo/demo.del',
data: {
id: item.data.id
}
});
if (retjson.code != 1)
return this.alert(retjson.errmsg);
this.init.list[item.data._idx]._del = true;
setTimeout(() => {
this.init.list.splice(item.data._idx, 1);
}, 500);
},
async audit(item) {
var msg = await this.inputmsg({
title: '请填写审核理由',
ele: 'textarea'
}, [{
name: '审核通过',
btn: 'ok'
}, {
name: '驳回',
btn: 'ng',
cls: 'dag liner'
}, {
name: '取消',
btn: 'cancel',
cls: 'def'
}]);
if (msg.btn == 'cancel')
return;
var retjson = await this.callfunc({
func: 'demo/demo.audit',
data: {
id: item.data.id,
msg: msg.text,
status: msg.btn == 'ng' ? 90 : 100,
}
});
if (retjson.code != 1)
return this.alert(retjson.errmsg);
this.init.list[item.data._idx] = this.objdeepmerge(this.init.list[item.data._idx], retjson.data);
},
showmenu(idx) {
var dat = this.init.list[idx];
dat._idx = idx;
var items = [];
items.push({
func: 'audit',
name: '审核',
data: dat
});
items.push({
func: 'edit',
name: '变更',
data: dat
});
items.push({
func: 'del',
name: '删除',
style: 'color:var(--dag5)',
data: dat
});
this.popmenu({
items
});
}
}
}
</script>

View File

@ -22,7 +22,11 @@
<view class="icon" :style="{backgroundImage:svg2bg(svg.cqd)}"></view> <view class="icon" :style="{backgroundImage:svg2bg(svg.cqd)}"></view>
<view class="name">游客页面</view> <view class="name">游客页面</view>
</view> </view>
<<<<<<< HEAD
<view class="grid" @tap="gourl" data-url="$/pages/lab/user_list">
=======
<view class="grid" @tap="gourl" data-url="$/pages/lab/userlist"> <view class="grid" @tap="gourl" data-url="$/pages/lab/userlist">
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
<view class="icon" :style="{backgroundImage:svg2bg(svg.cjf)}"></view> <view class="icon" :style="{backgroundImage:svg2bg(svg.cjf)}"></view>
<view class="name">成员管理</view> <view class="name">成员管理</view>
</view> </view>
@ -55,7 +59,10 @@
} }
}, },
onLoad() { onLoad() {
<<<<<<< HEAD
=======
console.log('onload'); console.log('onload');
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
if (this.opn.u) { if (this.opn.u) {
uni.navigateTo({ uni.navigateTo({
url: decodeURIComponent(this.opn.u) url: decodeURIComponent(this.opn.u)
@ -77,7 +84,10 @@
onShow() { onShow() {
if (this._meid === this.me.id) if (this._meid === this.me.id)
return; return;
<<<<<<< HEAD
=======
console.log('onshow 12'); console.log('onshow 12');
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
this._meid = this.me.id; this._meid = this.me.id;
this.pageno = 0; this.pageno = 0;
this.init.members = []; this.init.members = [];

View File

@ -0,0 +1,331 @@
<template>
<ciy-header title="搜索/列表/删除页" ref="header"></ciy-header>
<view v-if="init.code != 1">
<view class="px4 py4">
<view style="height:2em;width:60%;" class="ciy-skeleton"></view>
<view style="height:1em;width:40%;margin-left:1em;" class="ciy-skeleton"></view>
<view style="height:1em;width:50%;" class="ciy-skeleton"></view>
<view style="height:6em;width:100%;" class="ciy-skeleton"></view>
</view>
</view>
<view v-else>
<view class="sti" :style="{top:(header_statusbar_height+header_title_height)+'px'}">
<ciy-segment :lis="init.lis" all="全部" @change="segment_change"></ciy-segment>
<ciy-query ref="query" :gdict="g" :qry="init.searchinput" @confirm="query_confirm">
<template v-slot="{itm}">
<ciy-input :name="itm.item.form" v-model="itm.data[itm.item.form]"></ciy-input>
</template>
</ciy-query>
</view>
<view class="ciy-list" :class="{del:item._del}" v-for="(item,index) in init.list" :key="item.id" @tap="showmenu(index)">
<view class="l0">No: {{item.id}}</view>
<view v-if="item.id%2 == 0" class="rt">
<view class="code b" :class="ccode(g.auditstatus, item.auditstatus,'clas')">{{ccode(g.auditstatus, item.auditstatus)}}</view>
</view>
<view v-else class="rtz liner" :class="ccode(g.auditstatus, item.auditstatus,'clas')">
{{ccode(g.auditstatus, item.auditstatus)}}
</view>
<view class="l1 c">
<view>{{item.name}}</view>
</view>
<view class="ciy-hr"></view>
<view class="l2">审核人 {{ccode('xa_user', item.audituser)}}</view>
<view class="l2" v-if="item.auditmsg">审核理由 <text v-html="tobr(item.auditmsg)"></text></view>
<view class="l2">审核时间 {{todatetime(item.audittimes)}}</view>
<view class="ciy-hr"></view>
<view class="l2">
<label>所属菜单</label>
<view>{{ccode(init.zc_menu, item.menuid)}}</view>
</view>
<view class="l2">
<label>文件大小</label>
<view>{{tofix(item.filesize/1024, -2)}}KB</view>
</view>
<view class="l2">
<label>长度</label>
<view>{{tofix(item.metre/1000, -2)}}</view>
</view>
<view class="l2">
<label>贷款金额</label>
<view>{{tofix(item.bankmoney/1000000)}}万元</view>
</view>
<view class="l2">
<label>设置日期</label>
<view>{{todatetime(item.setdate, 'd')}}</view>
</view>
<view class="l2">
<label>设置时间</label>
<view>{{todatetime(item.settimes)}}</view>
</view>
<view class="l2">
<label>营业时间</label>
<view>{{totimepoint(item.dayclock, true)}}</view>
</view>
<ciy-showimgs label="文档" :src="item.downurl"></ciy-showimgs>
<ciy-showimgs :src="item.avar" width="20em" mode="widthFix"></ciy-showimgs>
<view class="l2">
<label>是否使用</label>
<view>{{item.isuse==1?'√':'×'}}</view>
</view>
<view class="l2">
<label>是否开启</label>
<view>{{item.isopen==1?'开启':'关闭'}}</view>
</view>
<view class="l2">
<label>库存单位</label>
<view>{{tounit(item.unit)}}</view>
</view>
<view class="l2">
<label>单选状态</label>
<view>{{ccode(g.auditstatus, item.sigstatus)}}</view>
</view>
<view class="l2">
<label>多选状态</label>
<view>
<view class="kbd" v-for="(itm, index) in scode(g.auditstatus, item.mauditstatus)" :key="index">{{itm.name}}</view>
</view>
</view>
<view class="l2">
<label>组织结构</label>
<view>{{mcode(g.zc_depart, item.prodcata, 'name').join(' . ')}}</view>
</view>
<view class="l2">
<label>所在地区</label>
<view>
<text class="code" v-for="(itm, index) in mcode(g.ciy_arearpc, item.areacode)" :key="index">{{itm.name}}</text>
</view>
</view>
<view class="l2">
<label>认证情况</label>
<view>
<text class="kbd" v-for="(itm, index) in bcode(g.renzheng, item.renzheng)" :key="index">{{itm.name}}</text>
</view>
</view>
<view class="l2">
<label>临时字典</label>
<view>{{ccode(g.ppint, item.ppint)}}</view>
</view>
<view class="l2">
<label>执行周期</label>
<view>{{tocyc(item.npcyc)}}</view>
</view>
<view class="l2">
<label>执行用时</label>
<view>{{totimesec(item.runsec)}}</view>
</view>
<view class="l2">
<label>活动期数</label>
<view>{{item.acttm}}</view>
</view>
<ciy-showimgs label="活动花絮" :src="item.imgs"></ciy-showimgs>
<view class="l2">
<label>吨位</label>
<view>{{tofix(item.ton/1000000, 3)}}</view>
</view>
<view class="l2">
<label>单价</label>
<view>{{tofix(item.price/100, 2)}}</view>
</view>
<view class="l2">
<label>位置</label>
<view><text style="text-decoration: underline;" @tap.stop="goloc(item.lat, item.lng)">查看位置</text>
</view>
</view>
<view class="l2">
<label>百分比</label>
<view>{{tofix(item.pct/100, 2)}}%</view>
</view>
<view class="l2">
<label>链接</label>
<view><text style="text-decoration: underline;" @tap.stop="goweb(item.url)">转到链接</text>
</view>
</view>
<view class="l2">
<label>体重</label>
<view>{{tofix(item.weightg/1000)}}公斤</view>
</view>
<view class="l2">
<label>耳温</label>
<view>{{tofix(item.eartmpr/1000, 1)}}</view>
</view>
<view class="l2">
<label>身份证号</label>
<view>{{tomsk(item.idcard,'******#*')}}</view>
</view>
<view class="rb">
添加时间 {{todatetime(item.addtimes)}}
</view>
</view>
<ciy-listend :page="pageno" :listlen="init.list.length" :nodataimg="file_stor('/img/mbnone.png')"></ciy-listend>
<view class="ciy-add" @tap="edit()"></view>
</view>
</template>
<style>
</style>
<script>
export default {
data() {
return {}
},
onLoad() {
this.load_ciydict(this.file_stor('/dict/ciy_arearpc.js')).then(json => {
if (json.code != 1)
return this.alert(json.errmsg);
this.g.ciy_arearpc = json.arr;
});
this.getlist();
},
onReachBottom(b) {
console.log('onReachBottom page', this.pageno);
if (this.init.code != 1)
return;
this.getlist();
},
onPullDownRefresh(b) {
console.log('onPullDownRefresh page');
this.pageno = 0;
this._stopPullDown = true;
this.getlist();
},
watch: {},
computed: {},
methods: {
async getlist() {
if (this.pageno < 0)
return;
if (this._loading)
return;
this.pagepost.pageno = this.pageno + 1;
this.pagepost.once = !this.init.once;
this._loading = true;
var retjson = await this.callfunc({
func: 'demo/demo.list',
data: this.pagepost
});
this._loading = false;
if (retjson.code != 1)
return this.alert(retjson.errmsg);
this.pageno++;
if (this.pageno == 1)
this.init.list = [];
this.init = this.objdeepmerge(this.init, retjson);
if (retjson.once) {
this.init.lis = [...this.g.auditstatus];
this.g.zc_depart = retjson.zc_depart;
this.g.ppint = retjson.ppint;
}
this.getrefs('query').then(ref => {
ref.setdata(retjson.where);
});
if (retjson.list.length < retjson.pagecount)
this.pageno = -1;
},
segment_change(e) {
this.pagepost.liid = e.value.id;
this.pageno = 0;
this.getlist();
uni.pageScrollTo({
scrollTop: 0,
duration: 800
});
},
query_confirm(dat) {
this.pagepost.query = dat;
this.pageno = 0;
this.getlist();
uni.pageScrollTo({
scrollTop: 0,
duration: 800
});
},
async edit(item) {
item = item || {
url: '',
data: {
id: 0,
_idx: -1
}
};
this.gourl('demo_edit?id=' + item.data.id, 'navigate', item.data, 'demo');
},
async del(item) {
if (await this.askmsg('是否删除?', '删除') != 'ok')
return;
var retjson = await this.callfunc({
func: 'demo/demo.del',
data: {
id: item.data.id
}
});
if (retjson.code != 1)
return this.alert(retjson.errmsg);
this.init.list[item.data._idx]._del = true;
setTimeout(() => {
this.init.list.splice(item.data._idx, 1);
}, 500);
},
async audit(item) {
var msg = await this.inputmsg({
title: '请填写审核理由',
ele: 'textarea'
}, [{
name: '审核通过',
btn: 'ok'
}, {
name: '驳回',
btn: 'ng',
cls: 'dag liner'
}, {
name: '取消',
btn: 'cancel',
cls: 'def'
}]);
if (msg.btn == 'cancel')
return;
var retjson = await this.callfunc({
func: 'demo/demo.audit',
data: {
id: item.data.id,
msg: msg.text,
status: msg.btn == 'ng' ? 90 : 100,
}
});
if (retjson.code != 1)
return this.alert(retjson.errmsg);
this.init.list[item.data._idx] = this.objdeepmerge(this.init.list[item.data._idx], retjson.data);
},
showmenu(idx) {
var dat = this.init.list[idx];
dat._idx = idx;
var items = [];
items.push({
func: 'audit',
name: '审核',
data: dat
});
items.push({
func: 'edit',
name: '变更',
data: dat
});
items.push({
func: 'del',
name: '删除',
style: 'color:var(--dag5)',
data: dat
});
this.popmenu({
items
});
}
}
}
</script>

View File

@ -0,0 +1,8 @@
{
"hash": "6d91775e",
"configHash": "990dbd84",
"lockfileHash": "e3b0c442",
"browserHash": "29c7d720",
"optimized": {},
"chunks": {}
}

View File

@ -0,0 +1,3 @@
{
"type": "module"
}

View File

@ -0,0 +1 @@
9098

View File

@ -19,8 +19,13 @@
"多语言切换": "多语言切换", "多语言切换": "多语言切换",
"tabbar.index": "广场", "tabbar.index": "广场",
<<<<<<< HEAD
"tabbar.me": "我的",
"tabbar.message":"消息中心",
=======
"tabbar.notify": "消息", "tabbar.notify": "消息",
"tabbar.me": "我的", "tabbar.me": "我的",
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
"login.xieyi": "/pages/main/paper?id=3", "login.xieyi": "/pages/main/paper?id=3",
"login.tablogin": "登录", "login.tablogin": "登录",
"login.tabreg": "注册", "login.tabreg": "注册",

View File

@ -38,6 +38,9 @@ export default defineConfig({
scss: {}, scss: {},
}, },
}, },
<<<<<<< HEAD
server: {},
=======
server: { server: {
// 仅新增这一段代理配置,其他保持不变 // 仅新增这一段代理配置,其他保持不变
port: 5173, // 保留你原本的5173端口 port: 5173, // 保留你原本的5173端口
@ -49,4 +52,5 @@ export default defineConfig({
} }
} }
}, },
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
}) })

View File

@ -42,7 +42,11 @@ function verifyuser($post = null) {
$auth = json_decode(encrypt($ciyauth, 'D', $_token['salt']), true); $auth = json_decode(encrypt($ciyauth, 'D', $_token['salt']), true);
if ($auth == null) if ($auth == null)
return null; return null;
<<<<<<< HEAD
$csql = new \ciy\sql('ap_user'); //弃用redis集群
=======
$csql = new \ciy\sql('lab_user'); //弃用redis集群 $csql = new \ciy\sql('lab_user'); //弃用redis集群
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
$csql->where('id', $auth['id']); $csql->where('id', $auth['id']);
$userrow = $db->getone($csql); $userrow = $db->getone($csql);
if (!is_array($userrow)) if (!is_array($userrow))
@ -53,12 +57,29 @@ function verifyuser($post = null) {
return null; return null;
if ($userrow['exptimes'] < time() - $_token['expsec']) if ($userrow['exptimes'] < time() - $_token['expsec'])
return null; return null;
<<<<<<< HEAD
if ($post && $userrow['upid'] == 0) {
$upid = $post->getint('upid');
if ($upid > 0) {
$updata = array();
$updata['upid'] = $upid;
$csql = new \ciy\sql('ap_user');
$csql->where('id', $userrow['id']);
$db->update($csql, $updata);
}
}
=======
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
if ($userrow['exptimes'] > time()) if ($userrow['exptimes'] > time())
return $userrow; return $userrow;
$exp = time() + $_token['swapsec']; $exp = time() + $_token['swapsec'];
$sid = randstr(10); $sid = randstr(10);
$auth['_s'] = $sid; $auth['_s'] = $sid;
<<<<<<< HEAD
if ($db->execute('update ap_user set exptimes=?,sid=? where id=?', array($exp, $sid, $auth['id'])) === false)
=======
if ($db->execute('update lab_user set exptimes=?,sid=? where id=?', array($exp, $sid, $auth['id'])) === false) if ($db->execute('update lab_user set exptimes=?,sid=? where id=?', array($exp, $sid, $auth['id'])) === false)
>>>>>>> 2b53f1cf47e1dea64c20044ab860c92bfd595c2a
return null; return null;
$authstr = json_encode($auth, JSON_PARTIAL_OUTPUT_ON_ERROR); $authstr = json_encode($auth, JSON_PARTIAL_OUTPUT_ON_ERROR);
$enauth = encrypt($authstr, 'E', $_token['salt']); $enauth = encrypt($authstr, 'E', $_token['salt']);

View File

@ -15,164 +15,176 @@ class login {
} }
return succjson(); return succjson();
} }
public static function json_login_mobile() {
// 登录接口 - 去掉权限限制 + 匹配前端MD5加密逻辑 global $db;
public static function json_login_mobile() { global $_token;
global $db; $post = new \ciy\post();
global $_token; $model = $post->get('model');
$post = new \ciy\post(); $appcid = $post->get('appcid');
$model = $post->get('model'); $user = $post->get('user');
$appcid = $post->get('appcid'); if (empty($user))
$user = $post->get('user'); return errjson('请填写用户名');
if (empty($user)) // 改动1表名从 ap_user 改为 lab_user
return errjson('请填写用户名'); $csql = new \ciy\sql('lab_user');
$csql->where('mobile', $user);
$csql = new \ciy\sql('lab_user'); $rsuser = $db->getone($csql);
$csql->where('mobile', $user); if ($rsuser === false)
$rsuser = $db->getone($csql); return errjson($db->error);
if (!is_array($rsuser)) {
if ($rsuser === false) savelog($db, 0, 'LOGINERR', '用户[' . $user . ']不存在,在尝试登录');
return errjson($db->error); return errjson('用户名不存在');
}
if (!is_array($rsuser)) {
savelog($db, 0, 'LOGINERR', '用户[' . $user . ']不存在,在尝试登录'); // 改动2校验字段名对齐确保 lab_user 有 trytime 字段,若无则注释/调整)
return errjson('用户名不存在'); if ($rsuser['trytime'] > 10) {
if (tostamp() - $rsuser['logintimes'] < 600) {
savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']登录连续失败');
return errjson('连续输入密码错误10分钟后再来登录.');
} }
}
// 去掉状态权限限制 - 所有用户均可登录
// 注释掉原有的stpstatus校验逻辑 $authtime = $post->getint('auth');
// if (!in_array($rsuser['stpstatus'], [10, 30, 50])) { if (abs($authtime / 1000 - tostamp()) > 300)
// savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']被禁用,在尝试登录'); return errjson('您的本地时间与服务器时间相差超过5分钟请调整本机时间。<br/>服务器时间: ' . date('Y-m-d H:i:s') . '<br/>您本机时间: ' . date('Y-m-d H:i:s', (int)($authtime / 1000)));
// return errjson('您的账户已经被禁用.');
// } // 改动4密码校验逻辑确保 lab_user 密码字段是 password加密规则不变
if ($post->get('pass') != md5($rsuser['password'] . $authtime)) {
// 密码错误次数限制(可选保留,如需关闭可注释)
if ($rsuser['trytime'] > 10) {
if (tostamp() - $rsuser['logintimes'] < 600) {
savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']登录连续失败');
return errjson('连续输入密码错误10分钟后再来登录.');
}
}
$authtime = $post->getint('auth');
$authSec = $authtime / 1000;
// 时间戳校验(兼容毫秒级)
if (abs($authSec - tostamp()) > 300)
return errjson('您的本地时间与服务器时间相差超过5分钟请调整本机时间。<br/>服务器时间: ' . date('Y-m-d H:i:s') . '<br/>您本机时间: ' . date('Y-m-d H:i:s', (int)$authSec));
// 密码校验:匹配前端加密逻辑 md5(数据库存储的MD5密码 + auth时间戳)
$checkPass = md5($rsuser['password'] . $authtime);
if ($post->get('pass') != $checkPass) {
$updata = array();
$updata['trytime'] = array('trytime+1');
$updata['logintimes'] = tostamp();
$csql = new \ciy\sql('lab_user');
$csql->where('id', $rsuser['id']);
$db->update($csql, $updata);
savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']登录密码错误');
return errjson('用户名或密码错误.');
}
// 登录成功 - 更新用户状态
$sid = randstr(10);
$exp = tostamp() + $_token['swapsec'];
$id = $rsuser['id'];
$updata = array(); $updata = array();
$updata['trytime'] = array('trytime+1');
$updata['logintimes'] = tostamp(); $updata['logintimes'] = tostamp();
$updata['trytime'] = 0;
$updata['sid'] = $sid;
$updata['exptimes'] = $exp;
$updata['ip'] = getip();
// 改动5更新操作表名改为 lab_user
$csql = new \ciy\sql('lab_user'); $csql = new \ciy\sql('lab_user');
$csql->where('id', $id); $csql->where('id', $rsuser['id']);
if ($db->update($csql, $updata) === false) $db->update($csql, $updata);
return errjson('user数据库更新失败:' . $db->error); savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']登录密码错误' . md5('1' . $_token['salt']));
return errjson('用户名或密码错误.');
}
$sid = randstr(10);
$exp = tostamp() + $_token['swapsec'];
$id = $rsuser['id'];
$updata = array();
$updata['logintimes'] = tostamp();
$updata['trytime'] = 0;
$updata['sid'] = $sid;
$updata['exptimes'] = $exp;
$updata['ip'] = getip();
// 改动6登录成功更新表名改为 lab_user
$csql = new \ciy\sql('lab_user');
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
return errjson('user数据库更新失败:' . $db->error);
self::savelug($db, 1, $rsuser['id'], $model); if (!empty($appcid)) {
$ret = self::getsync($rsuser, $sid); // 改动7若 ap_usr_ext 关联 lab_user需确认表名是否改为 lab_usr_ext若无则保留仅改关联id为lab_user的id
$csql = new \ciy\sql('ap_usr_ext');
// 调试用户逻辑 $csql->where('id', $rsuser['id']);
$extrow = $db->getone($csql);
if (is_array($extrow)) {
if ($extrow['appcid'] != $appcid) {
$updata = array();
$updata['appcid'] = $appcid;
if ($db->update($csql, $updata) === false)
throw new \Exception('ext更新失败:' . $db->error);
}
} else {
$updata = array();
$updata['appcid'] = $appcid;
$updata['id'] = $rsuser['id'];
if ($db->insert($csql, $updata) === false)
throw new \Exception('ext新增失败:' . $db->error);
}
}
self::savelug($db, 1, $rsuser['id'], $model);
$ret = self::getsync($rsuser, $sid);
// 改动8调试用户表若关联 lab_user需确认 zc_debug_user 的 user 字段是 lab_user 的 id若无则保留
$csql = new \ciy\sql('zc_debug_user');
$csql->where('targettype', 21);
$csql->where('isuse', 1);
$csql->where('user', $id);
if (is_array($db->getone($csql))) {
$csql = new \ciy\sql('zc_debug_user'); $csql = new \ciy\sql('zc_debug_user');
$csql->where('targettype', 21); $csql->where('targettype', 21);
$csql->where('isuse', 1); $csql->column('user,name');
$csql->where('user', $id); $ret['dbgs'] = $db->get($csql);
if (is_array($db->getone($csql))) {
$csql = new \ciy\sql('zc_debug_user');
$csql->where('targettype', 21);
$csql->column('user,name');
$ret['dbgs'] = $db->get($csql);
}
return $ret;
} }
return $ret;
// 注册接口 - 去掉权限限制 + 密码存储为MD5 }
public static function json_reg_mobile() { public static function json_reg_mobile() {
global $db; global $db;
global $_token; global $_token;
$post = new \ciy\post(); $post = new \ciy\post();
$model = $post->get('model'); $model = $post->get('model');
$appcid = $post->get('appcid'); $appcid = $post->get('appcid');
$user = $post->get('user'); $upid = $post->getint('upid');
$pass = $post->get('pass'); $user = $post->get('user');
$pass = $post->get('pass');
if (empty($user)) if (empty($user))
return errjson('请填写手机号'); return errjson('请填写手机号');
if (empty($pass)) if (empty($pass))
return errjson('请填写密码'); return errjson('请填写密码');
// 改动1表名从 ap_user 改为 lab_user
$csql = new \ciy\sql('lab_user');
$csql->where('mobile', $user);
$rsuser = $db->getone($csql);
if ($rsuser === false)
return errjson($db->error);
if (is_array($rsuser))
return errjson('该手机号已被注册');
$csql = new \ciy\sql('lab_user'); $sid = randstr(10);
$csql->where('mobile', $user); $exp = tostamp() + $_token['swapsec']; //默认三天过期,每天换秘钥
$rsuser = $db->getone($csql); $rsuser = array();
if ($rsuser === false)
return errjson($db->error);
if (is_array($rsuser))
return errjson('该手机号已被注册');
$sid = randstr(10); $rsuser['laborgid'] = 0;
$exp = tostamp() + $_token['swapsec']; $rsuser['name'] = ':' . substr($user, -4); // 姓名(默认值,若前端传则改为 $post->get('name')
$rsuser = array(); $rsuser['usertitle'] = 0; // 职称(默认值)
$rsuser['stpstatus'] = 30; // 任意状态均可登录(已去掉限制) $rsuser['education'] = 0; // 学历(默认值)
$rsuser['userlevel'] = 10; $rsuser['sn'] = ''; // 编号(默认值)
$rsuser['name'] = ':' . substr($user, -4); $rsuser['sex'] = 90; // 性别(默认值)
$rsuser['mobile'] = $user; $rsuser['stpstatus'] = 10; // 状态(启用)
$rsuser['password'] = $pass; // 存储前端传递的MD5密码 $rsuser['userlevel'] = 10; // 用户等级
$rsuser['trytime'] = 0; $rsuser['mobile'] = $user;
$rsuser['logintimes'] = tostamp(); $rsuser['email'] = '';
$rsuser['addtimes'] = tostamp(); $rsuser['password'] = $pass; // 密码(保持原加密规则)
$rsuser['sid'] = $sid; $rsuser['dvotecnt'] = 0; // 投票数(默认值)
$rsuser['exptimes'] = $exp; $rsuser['trytime'] = 0;
$rsuser['ip'] = getip(); $rsuser['logintimes'] = tostamp();
$rsuser['laborgid'] = 0; $rsuser['addtimes'] = tostamp();
$rsuser['usertitle'] = 0; $rsuser['sid'] = $sid;
$rsuser['sn'] = ''; $rsuser['exptimes'] = $exp;
$rsuser['sex'] = 0; $rsuser['ip'] = getip();
$rsuser['totalpnt'] = 0;
$rsuser['dvotecnt'] = 0; // 改动3插入操作表名改为 lab_user
$rsuser['email'] = ''; $csql = new \ciy\sql('lab_user');
if ($db->insert($csql, $rsuser) === false)
$csql = new \ciy\sql('lab_user'); return errjson('注册用户失败:' . $db->error);
if ($db->insert($csql, $rsuser) === false) $id = $db->insert_id();
return errjson('注册用户失败:' . $db->error); $rsuser['id'] = $id;
$id = $db->insert_id();
$rsuser['id'] = $id; if (!empty($appcid)) {
$updata = array();
if (!empty($appcid)) { $updata['id'] = $id;
$updata = array(); $updata['appcid'] = $appcid;
$updata['id'] = $id; // 改动4若 ap_usr_ext 关联 lab_user需确认表名若无则保留
$updata['appcid'] = $appcid; $csql = new \ciy\sql('ap_usr_ext');
$csql = new \ciy\sql('ap_usr_ext'); if ($db->insert($csql, $updata) === false)
if ($db->insert($csql, $updata) === false) return errjson('更新appcid失败:' . $db->error);
return errjson('更新appcid失败:' . $db->error);
}
self::savelug($db, 1, $rsuser['id'], '手机注册:' . $model);
return self::getsync($rsuser, $sid);
} }
// 微信自动登录 if ($upid > 0) {
//上级用户统计(如需关联 lab_user 则调整,否则保留)
}
self::savelug($db, 1, $rsuser['id'], '手机注册:' . $model);
return self::getsync($rsuser, $sid);
}
public static function json_wx_autouser() { public static function json_wx_autouser() {
global $db; global $db;
global $_token; global $_token;
@ -181,7 +193,6 @@ class login {
$upid = $post->getint('upid'); $upid = $post->getint('upid');
$weixinapi = new \web\api\weixin(1); $weixinapi = new \web\api\weixin(1);
$wxret = $weixinapi->call('https://api.weixin.qq.com/sns/jscode2session?grant_type=authorization_code&appid={appid}&secret={appsecret}&js_code=' . $code); $wxret = $weixinapi->call('https://api.weixin.qq.com/sns/jscode2session?grant_type=authorization_code&appid={appid}&secret={appsecret}&js_code=' . $code);
if (is_string($wxret)) if (is_string($wxret))
return errjson($wxret); return errjson($wxret);
@ -192,8 +203,7 @@ class login {
$rsuser = $db->getone($csql); $rsuser = $db->getone($csql);
$userid = 0; $userid = 0;
$sid = randstr(10); $sid = randstr(10);
$exp = tostamp() + $_token['swapsec']; $exp = tostamp() + $_token['swapsec']; //默认三天过期,每天换秘钥
if (is_array($rsuser)) { if (is_array($rsuser)) {
$userid = $rsuser['id']; $userid = $rsuser['id'];
if ($rsuser['upid'] == 0 && $upid > 0 && $upid != $userid) if ($rsuser['upid'] == 0 && $upid > 0 && $upid != $userid)
@ -207,13 +217,12 @@ class login {
$rsuser['sid'] = $sid; $rsuser['sid'] = $sid;
$rsuser['exptimes'] = $exp; $rsuser['exptimes'] = $exp;
$rsuser['ip'] = getip(); $rsuser['ip'] = getip();
$csql = new \ciy\sql('ap_user'); $csql = new \ciy\sql('ap_user');
$csql->where('id', $userid); $csql->where('id', $userid);
if ($db->update($csql, $rsuser) === false) if ($db->update($csql, $rsuser) === false)
return errjson('wx更新失败:' . $db->error); return errjson('wx更新失败:' . $db->error);
} else { } else {
$newpnt = 1000; $newpnt = 1000; //注册赠送积分
$rsuser = array(); $rsuser = array();
$rsuser['upid'] = $upid; $rsuser['upid'] = $upid;
if (isset($wxret['unionid'])) if (isset($wxret['unionid']))
@ -236,12 +245,10 @@ class login {
$rsuser['exptimes'] = $exp; $rsuser['exptimes'] = $exp;
$rsuser['accounttimes'] = tostamp() + 86400 * 3; $rsuser['accounttimes'] = tostamp() + 86400 * 3;
$rsuser['ip'] = getip(); $rsuser['ip'] = getip();
$csql = new \ciy\sql('ap_user'); $csql = new \ciy\sql('ap_user');
if ($db->insert($csql, $rsuser) === false) if ($db->insert($csql, $rsuser) === false)
return errjson('wx新增失败:' . $db->error); return errjson('wx新增失败:' . $db->error);
$rsuser['id'] = $db->insert_id(); $rsuser['id'] = $db->insert_id();
if ($newpnt > 0) { if ($newpnt > 0) {
$updata = array(); $updata = array();
$updata['pnt'] = 1000; $updata['pnt'] = 1000;
@ -252,11 +259,17 @@ class login {
if ($db->insert($csql, $updata) === false) if ($db->insert($csql, $updata) === false)
return errjson('reward新增失败:' . $db->error); return errjson('reward新增失败:' . $db->error);
} }
if ($upid > 0) {
// $updata = array();
// $updata['upall'] = array('upall+1');
// $csql = new \ciy\sql('ap_user');
// $csql->where('id', $upid);
// if ($db->update($csql, $updata) === false)
// return errjson('上线统计失败:' . $db->error);
}
} }
return self::getsync($rsuser, $sid); return self::getsync($rsuser, $sid);
} }
// 忘记密码
public static function json_forgetpass() { public static function json_forgetpass() {
global $db; global $db;
global $_token; global $_token;
@ -264,9 +277,8 @@ class login {
$model = $post->get('model'); $model = $post->get('model');
$mobile = $post->get('user'); $mobile = $post->get('user');
$pass = $post->get('pass'); $pass = $post->get('pass');
$code = $post->get('captcha'); $code = $post->get('capsms');
$codeid = $post->getint('capsms_id'); $codeid = $post->getint('capsms_id');
if (empty($code)) if (empty($code))
return errjson('请填写验证码'); return errjson('请填写验证码');
if (empty($mobile)) if (empty($mobile))
@ -274,28 +286,23 @@ class login {
if (empty($pass)) if (empty($pass))
return errjson('请填写密码'); return errjson('请填写密码');
$csql = new \ciy\sql('lab_user'); $csql = new \ciy\sql('ap_user');
$csql->where('mobile', $mobile); $csql->where('mobile', $mobile);
$rsuser = $db->getone($csql); $rsuser = $db->getone($csql);
if (!is_array($rsuser)) if (!is_array($rsuser))
return errjson('该手机号未注册'); return errjson('该手机号未注册');
$csql = new \ciy\sql('ap_usr_capcode'); $csql = new \ciy\sql('ap_usr_capcode');
$csql->where('id', $codeid); $csql->where('id', $codeid);
$caprow = $db->getone($csql); $caprow = $db->getone($csql);
if (!is_array($caprow)) if (!is_array($caprow))
return errjson('未发送验证码'); return errjson('未发送验证码');
if ($caprow['exptimes'] < time()) if ($caprow['exptimes'] < time())
return errjson('验证码已过期'); return errjson('验证码已过期');
$errmsg = ''; $errmsg = '';
if ($caprow['account'] != $mobile) if ($caprow['account'] != $mobile)
$errmsg = '验证码与手机号不匹配'; $errmsg = '验证码与手机号不匹配';
if ($caprow['code'] != $code) if ($caprow['code'] != $code)
$errmsg = '验证码错误'; $errmsg = '验证码错误';
if (!empty($errmsg)) { if (!empty($errmsg)) {
$updata = array(); $updata = array();
$updata['exptimes'] = array('exptimes-180'); $updata['exptimes'] = array('exptimes-180');
@ -305,49 +312,41 @@ class login {
return errjson('减扣失败:' . $db->error); return errjson('减扣失败:' . $db->error);
return errjson($errmsg); return errjson($errmsg);
} }
$sid = randstr(10); $sid = randstr(10);
$exp = tostamp() + $_token['swapsec']; $exp = tostamp() + $_token['swapsec']; //默认三天过期,每天换秘钥
$updata = array(); $updata = array();
$updata['trytime'] = 0; $updata['trytime'] = 0;
$updata['password'] = $pass; // 存储MD5密码 $updata['password'] = $pass;
$updata['logintimes'] = tostamp(); $updata['logintimes'] = tostamp();
$updata['trytime'] = 0; $updata['trytime'] = 0;
$updata['sid'] = $sid; $updata['sid'] = $sid;
$updata['exptimes'] = $exp; $updata['exptimes'] = $exp;
$updata['ip'] = getip(); $updata['ip'] = getip();
$csql = new \ciy\sql('ap_user');
$csql = new \ciy\sql('lab_user');
$csql->where('id', $caprow['vuser']); $csql->where('id', $caprow['vuser']);
if ($db->update($csql, $updata) === false) if ($db->update($csql, $updata) === false)
return errjson('密码更新失败:' . $db->error); return errjson('密码更新失败:' . $db->error);
self::savelug($db, 1, $rsuser['id'], '密码找回成功:' . $model); self::savelug($db, 1, $rsuser['id'], '密码找回成功:' . $model);
return self::getsync($rsuser, $sid); return self::getsync($rsuser, $sid);
return succjson();
} }
// 发送短信验证码
public static function json_sendsms() { public static function json_sendsms() {
global $db; global $db;
$post = new \ciy\post(); $post = new \ciy\post();
$mobile = $post->get('account'); $mobile = $post->get('account');
$length = $post->getint('length'); $length = $post->getint('length');
if ($length < 3 || $length > 8) if ($length < 3 || $length > 8)
return errjson('验证码长度必须在3-8位之间'); return errjson('验证码长度必须在3-8位之间');
$csql = new \ciy\sql('ap_user');
$csql = new \ciy\sql('lab_user');
$csql->where('mobile', $mobile); $csql->where('mobile', $mobile);
$rsuser = $db->getone($csql); $rsuser = $db->getone($csql);
if (!is_array($rsuser)) if (!is_array($rsuser))
return errjson('该手机号未注册'); return errjson('该手机号未注册');
$csql = new \ciy\sql('ap_usr_capcode'); $csql = new \ciy\sql('ap_usr_capcode');
$csql->where('account', $mobile); $csql->where('account', $mobile);
$csql->where('addtimes>', tostamp() - 60); $csql->where('addtimes>', tostamp() - 1);
$cnt = $db->get1($csql); $cnt = $db->get1($csql);
if ($cnt > 0) if ($cnt > 0)
return errjson('验证码发送频繁请1分钟后再尝试'); return errjson('验证码发送频繁请1分钟后再尝试');
@ -358,11 +357,9 @@ class login {
$updata['code'] = $code; $updata['code'] = $code;
$updata['addtimes'] = tostamp(); $updata['addtimes'] = tostamp();
$updata['exptimes'] = tostamp() + 600; $updata['exptimes'] = tostamp() + 600;
$csql = new \ciy\sql('ap_usr_capcode'); $csql = new \ciy\sql('ap_usr_capcode');
if ($db->insert($csql, $updata) === false) if ($db->insert($csql, $updata) === false)
return errjson('更新失败:' . $db->error); return errjson('更新失败:' . $db->error);
$id = $db->insert_id(); $id = $db->insert_id();
$data = array(); $data = array();
$data['txt'] = $code; $data['txt'] = $code;
@ -372,69 +369,82 @@ class login {
"data" => $data, "data" => $data,
"sendnow" => true, "sendnow" => true,
); );
$retapi = ciy_api('sms', $param); $retapi = ciy_api('sms', $param);
if ($retapi !== true) if ($retapi !== true)
return errjson($retapi); return errjson($retapi);
$ret['id'] = $id; $ret['id'] = $id;
return succjson($ret); return succjson($ret);
} }
// 重新获取存储信息
public static function json_restorage() { public static function json_restorage() {
global $db; global $db;
$rsuser = verifyfast(); $rsuser = verifyfast();
return self::getsync($rsuser); return self::getsync($rsuser);
} }
// 生成登录返回数据
static function getsync($userrow, $sid = '') { static function getsync($userrow, $sid = '') {
global $db; global $db;
global $_token; global $_token;
$ret = array(); $ret = array();
if (!empty($sid)) { if (!empty($sid)) {
$auth = array(); $auth = array();
$auth['id'] = $userrow['id']; $auth['id'] = $userrow['id'];
$auth["_s"] = $sid; $auth["_s"] = $sid;
$authstr = json_encode($auth, JSON_PARTIAL_OUTPUT_ON_ERROR); $authstr = json_encode($auth, JSON_PARTIAL_OUTPUT_ON_ERROR);
$enauth = encrypt($authstr, 'E', $_token['salt']); $enauth = encrypt($authstr, 'E', $_token['salt']);
if ($_token['type'] == 'cookie') { if ($_token['type'] == 'cookie') {
$headercookie = 'Set-Cookie: ' . $_token['field'] . '=' . $enauth . '; expires=' . gmdate('D, d-M-Y H:i:s T', time() + $_token['swapsec'] + $_token['expsec']) . '; path=/; SameSite=None; Secure; httponly'; $headercookie = 'Set-Cookie: ' . $_token['field'] . '=' . $enauth . '; expires=' . gmdate('D, d-M-Y H:i:s T', time() + $_token['swapsec'] + $_token['expsec']) . '; path=/; SameSite=None; Secure; httponly';
header($headercookie); header($headercookie); //Cookie方式安全性好
} else { } else {
$ret['_ciyauth'] = $enauth; $ret['_ciyauth'] = $enauth; //Localstorage方式兼容性更好
//header($_token['field'] . ': ' . $enauth); //有坑
} }
} }
$ret['storage'] = array(); $ret['storage'] = array();
$csql = new \ciy\sql('zc_admin'); $csql = new \ciy\sql('zc_admin');
$csql->column('id,name'); $csql->column('id,name');
$ret['storage']['adminuser'] = $db->get($csql); $ret['storage']['adminuser'] = $db->get($csql);
$csql = new \ciy\sql('zc_cata'); $csql = new \ciy\sql('zc_cata');
$csql->order('csort'); $csql->order('csort');
$ret['storage']['cata'] = $db->get($csql); $ret['storage']['cata'] = $db->get($csql);
$csql = new \ciy\sql('ap_pnt_track'); $csql = new \ciy\sql('ap_pnt_track');
$ret['pnttrack'] = $db->get($csql); $ret['pnttrack'] = $db->get($csql);
$ret['me'] = array(); $ret['me'] = array();
$ret['me']['addtimes'] = $userrow['addtimes']; $ret['me']['addtimes'] = $userrow['addtimes'];
$ret['me']['accounttimes'] = $userrow['accounttimes'];
//$ret['me']['saasid_a'] = $userrow['saasid_a'];
$ret['me']['id'] = $userrow['id']; $ret['me']['id'] = $userrow['id'];
$ret['me']['eid'] = enid($userrow['id']); $ret['me']['eid'] = enid($userrow['id']);
$ret['me']['upid'] = $userrow['upid'];
$ret['me']['icon'] = $userrow['icon'];
$ret['me']['mobile'] = $userrow['mobile']; $ret['me']['mobile'] = $userrow['mobile'];
$ret['me']['name'] = $userrow['name']; $ret['me']['name'] = $userrow['name'];
$ret['me']['dvotecnt'] = $userrow['dvotecnt']; $ret['me']['userlevel'] = $userrow['userlevel'];
$ret['me']['mymoney'] = $userrow['mymoney'];
$ret['me']['mycashmoney'] = $userrow['mycashmoney'];
$ret['me']['myinvmoney'] = $userrow['myinvmoney'];
$ret['me']['mybondmoney'] = $userrow['mybondmoney'];
$ret['me']['mypnt'] = $userrow['mypnt'];
$ret['me']['certs'] = $userrow['certs'];
$ret['me']['needpass'] = empty($userrow['password']); $ret['me']['needpass'] = empty($userrow['password']);
$ret['me']['cciy'] = ''; $ret['me']['cciy'] = '';
$csql = new \ciy\sql('ap_usr_ext');
$csql->where('id', $userrow['id']);
$extrow = $db->getone($csql);
if (is_array($extrow)) {
$ret['me']['truename'] = $extrow['truename'];
$ret['me']['email'] = $extrow['email'];
$ret['me']['wxno'] = $extrow['wxno'];
$ret['me']['idid'] = $extrow['idid'];
$ret['me']['cciy'] = $extrow['cciy'] . '';
$ret['me']['cashtype'] = $extrow['cashtype'];
$ret['me']['bankno'] = $extrow['bankno'];
$ret['me']['bankname'] = $extrow['bankname'];
$ret['me']['bankaccount'] = $extrow['bankaccount'];
$ret['me']['bankcode'] = $extrow['bankcode'];
} else {
$ret['me']['truename'] = '';
}
return succjson($ret); return succjson($ret);
} }
// 退出登录
public static function json_logout() { public static function json_logout() {
global $db; global $db;
$rsuser = verifyuser(); $rsuser = verifyuser();
@ -443,50 +453,38 @@ class login {
} }
return succjson(); return succjson();
} }
// 调试切换用户
public static function json_debug_chguser() { public static function json_debug_chguser() {
global $db; global $db;
global $_token; global $_token;
$post = new \ciy\post(); $post = new \ciy\post();
$usercode = $post->getint('code'); $usercode = $post->getint('code');
$csql = new \ciy\sql('ap_user'); $csql = new \ciy\sql('ap_user');
$csql->where('id', $usercode); $csql->where('id', $usercode);
$rsuser = $db->getone($csql); $rsuser = $db->getone($csql);
if (!is_array($rsuser)) if (!is_array($rsuser))
return errjson('用户不存在'); return errjson('用户不存在');
$sid = randstr(10); $sid = randstr(10);
$exp = tostamp() + $_token['swapsec']; $exp = tostamp() + $_token['swapsec'];
$id = $rsuser['id']; $id = $rsuser['id'];
$updata = array(); $updata = array();
$updata['sid'] = $sid; $updata['sid'] = $sid;
$updata['exptimes'] = $exp; $updata['exptimes'] = $exp;
$csql = new \ciy\sql('ap_user'); $csql = new \ciy\sql('ap_user');
$csql->where('id', $id); $csql->where('id', $id);
if ($db->update($csql, $updata) === false) if ($db->update($csql, $updata) === false)
return errjson('user数据库更新失败:' . $db->error); return errjson('user数据库更新失败:' . $db->error);
return self::getsync($rsuser, $sid); return self::getsync($rsuser, $sid);
} }
// 调试操作用户
public static function json_debug_opuser() { public static function json_debug_opuser() {
global $db; global $db;
$post = new \ciy\post(); $post = new \ciy\post();
$code = $post->getint('text'); $code = $post->getint('text');
$btn = $post->get('btn'); $btn = $post->get('btn');
$csql = new \ciy\sql('ap_user'); $csql = new \ciy\sql('ap_user');
$csql->where('id', $code); $csql->where('id', $code);
$rsuser = $db->getone($csql); $rsuser = $db->getone($csql);
if (!is_array($rsuser)) if (!is_array($rsuser))
return errjson('用户不存在'); return errjson('用户不存在');
if ($btn == 'del') { if ($btn == 'del') {
$csql = new \ciy\sql('zc_debug_user'); $csql = new \ciy\sql('zc_debug_user');
$csql->where('targettype', 21); $csql->where('targettype', 21);
@ -495,43 +493,36 @@ class login {
return errjson('dbg删除失败:' . $db->error); return errjson('dbg删除失败:' . $db->error);
return succjson(); return succjson();
} }
$csql = new \ciy\sql('zc_debug_user'); $csql = new \ciy\sql('zc_debug_user');
$csql->where('targettype', 21); $csql->where('targettype', 21);
$csql->where('user', $code); $csql->where('user', $code);
if (is_array($db->getone($csql))) if (is_array($db->getone($csql)))
return errjson('已存在'); return errjson('已存在');
$updata = array(); $updata = array();
$updata['targettype'] = 21; $updata['targettype'] = 21;
$updata['isuse'] = 2; $updata['isuse'] = 2;
$updata['name'] = $rsuser['name']; $updata['name'] = $rsuser['name'];
$updata['user'] = $code; $updata['user'] = $code;
$updata['pass'] = ''; $updata['pass'] = '';
$csql = new \ciy\sql('zc_debug_user'); $csql = new \ciy\sql('zc_debug_user');
if ($db->insert($csql, $updata) === false) if ($db->insert($csql, $updata) === false)
return errjson('debug_user新增失败:' . $db->error); return errjson('debug_user新增失败:' . $db->error);
$ret['data'] = array('user' => $code, 'name' => $rsuser['name']); $ret['data'] = array('user' => $code, 'name' => $rsuser['name']);
return succjson($ret); return succjson($ret);
} }
// 获取APP版本
public static function json_getappver() { public static function json_getappver() {
global $dbn; global $dbn;
//0a.0b.000c如果版本a.b有变化先给app链接。如果只有c有变化给wgt
//$rsuser = verifytob();//根据用户灰度升级
$post = new \ciy\post(); $post = new \ciy\post();
$cplat = $post->get('plat'); $cplat = $post->get('plat'); //android,ios,harmony
$vercode = $post->getint('vercode'); $vercode = $post->getint('vercode');
$ver = (int)getconfig($dbn, 'ver' . $cplat . 'code'); $ver = (int)getconfig($dbn, 'ver' . $cplat . 'code');
$ret = array(); $ret = array();
if ($ver > $vercode) { if ($ver > $vercode) {
$urlb = getconfig($dbn, 'ver' . $cplat . 'url'); $urlb = getconfig($dbn, 'ver' . $cplat . 'url');
$url = $urlb . $ver . '.wgt'; $url = $urlb . $ver . '.wgt';
$ver = (int)($ver / 10000); $ver = (int)($ver / 10000);
if ($ver > (int)($vercode / 10000)) { if ($ver > (int)($vercode / 10000)) {
$url = $urlb . $ver . '.apk'; $url = $urlb . $ver . '.apk';
} }
@ -539,19 +530,6 @@ class login {
} }
return succjson($ret); return succjson($ret);
} }
// 调试用户列表
public static function json_debug_list() {
global $db;
$csql = new \ciy\sql('zc_debug_user');
$csql->where('targettype', 21);
$csql->where('isuse', 1);
$csql->column('user,name,pass');
$list = $db->get($csql);
return succjson(['list' => $list]);
}
// 保存登录日志
private static function savelug($db, $isinout, $userid, $model = '') { private static function savelug($db, $isinout, $userid, $model = '') {
$updata = array(); $updata = array();
$updata['isinout'] = $isinout; $updata['isinout'] = $isinout;
@ -559,9 +537,8 @@ class login {
$updata['addtimes'] = tostamp(); $updata['addtimes'] = tostamp();
$updata['ip'] = getip(); $updata['ip'] = getip();
$updata['model'] = dbstr($model, 250); $updata['model'] = dbstr($model, 250);
$csql = new \ciy\sql('ap_lug'); $csql = new \ciy\sql('ap_lug');
$db->insert($csql, $updata); $db->insert($csql, $updata);
return false; return false;
} }
} }

View File

@ -1,5 +1,5 @@
cqd:<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M546.334118 258.198588V106.315294h288.527058V57.825882c0-31.924706-25.840941-57.825882-57.825882-57.825882H103.002353a57.825882 57.825882 0 0 0-57.825882 57.825882v886.66353C45.176471 976.414118 71.077647 1002.315294 103.002353 1002.315294H777.035294a57.765647 57.765647 0 0 0 57.795765-57.825882v-63.668706H121.133176v-151.853177H834.861176v-55.717647H121.133176v-151.823058H834.861176v-55.717648h-288.527058v-151.823058h288.527058v-55.717647h-288.527058z" fill="#A267F8"></path><path d="M834.861176 465.679059h121.494589V313.825882H834.861176z" fill="#F9D11F"></path><path d="M546.334118 465.679059h288.527058V313.825882h-288.527058z" fill="#7E42B9"></path><path d="M834.861176 673.249882h121.494589v-151.853176H834.861176z" fill="#F9D11F"></path><path d="M121.103059 673.249882h713.728v-151.853176H121.103059z" fill="#7E42B9"></path><path d="M834.861176 258.168471h121.494589V106.315294H834.861176z" fill="#F9D11F"></path><path d="M546.334118 258.168471h288.527058V106.315294h-288.527058z" fill="#7E42B9"></path><path d="M834.861176 880.790588h121.494589v-151.853176H834.861176z" fill="#F9D11F"></path><path d="M121.103059 880.790588h713.728v-151.853176H121.103059z" fill="#7E42B9"></path><path d="M485.586824 465.709176H121.103059v-81.799529a70.053647 70.053647 0 0 1 70.053647-70.053647h224.37647a70.053647 70.053647 0 0 1 70.053648 70.053647v81.799529zM386.891294 189.831529a83.516235 83.516235 0 1 1-167.03247 0 83.516235 83.516235 0 0 1 167.03247 0" fill="#FFFFFF"></path></svg> cqd:<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M546.334118 258.198588V106.315294h288.527058V57.825882c0-31.924706-25.840941-57.825882-57.825882-57.825882H103.002353a57.825882 57.825882 0 0 0-57.825882 57.825882v886.66353C45.176471 976.414118 71.077647 1002.315294 103.002353 1002.315294H777.035294a57.765647 57.765647 0 0 0 57.795765-57.825882v-63.668706H121.133176v-151.853177H834.861176v-55.717647H121.133176v-151.823058H834.861176v-55.717648h-288.527058v-151.823058h288.527058v-55.717647h-288.527058z" fill="#A267F8"></path><path d="M834.861176 465.679059h121.494589V313.825882H834.861176z" fill="#F9D11F"></path><path d="M546.334118 465.679059h288.527058V313.825882h-288.527058z" fill="#7E42B9"></path><path d="M834.861176 673.249882h121.494589v-151.853176H834.861176z" fill="#F9D11F"></path><path d="M121.103059 673.249882h713.728v-151.853176H121.103059z" fill="#7E42B9"></path><path d="M834.861176 258.168471h121.494589V106.315294H834.861176z" fill="#F9D11F"></path><path d="M546.334118 258.168471h288.527058V106.315294h-288.527058z" fill="#7E42B9"></path><path d="M834.861176 880.790588h121.494589v-151.853176H834.861176z" fill="#F9D11F"></path><path d="M121.103059 880.790588h713.728v-151.853176H121.103059z" fill="#7E42B9"></path><path d="M485.586824 465.709176H121.103059v-81.799529a70.053647 70.053647 0 0 1 70.053647-70.053647h224.37647a70.053647 70.053647 0 0 1 70.053648 70.053647v81.799529zM386.891294 189.831529a83.516235 83.516235 0 1 1-167.03247 0 83.516235 83.516235 0 0 1 167.03247 0" fill="#FFFFFF"></path></svg>
cjf:<svg t="1769005770717" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5486" width="200" height="200"><path d="M 501.76 20.48 C 225.28 20.48 0 245.76 0 522.24 S 225.28 1024 501.76 1024 S 1003.52 798.72 1003.52 522.24 S 778.24 20.48 501.76 20.48 Z m 303.104 342.016 c -8.192 81.92 -53.248 61.44 -28.672 112.64 c -45.056 6.144 -43.008 10.24 -90.112 0 c 0 0 2.048 -2.048 2.048 -4.096 c 24.576 -47.104 -22.528 -28.672 -30.72 -112.64 c -10.24 -120.832 161.792 -120.832 147.456 4.096 Z m -55.296 155.648 c -2.048 8.192 -6.144 16.384 -10.24 22.528 l -20.48 -24.576 c 0 -2.048 -2.048 -2.048 -2.048 -4.096 l 32.768 6.144 Z M 493.568 206.848 c 118.784 0 104.448 135.168 69.632 192.512 c -20.48 32.768 -36.864 22.528 -14.336 71.68 c -61.44 8.192 -51.2 10.24 -114.688 0 c 0 0 2.048 -2.048 0 -2.048 c 24.576 -38.912 4.096 -40.96 -12.288 -67.584 c -43.008 -75.776 -38.912 -194.56 71.68 -194.56 Z m -161.792 159.744 c -4.096 22.528 -12.288 45.056 -22.528 59.392 s -22.528 28.672 -6.144 47.104 c -28.672 14.336 -57.344 10.24 -88.064 2.048 c 28.672 -49.152 -24.576 -32.768 -30.72 -118.784 c -6.144 -116.736 165.888 -116.736 147.456 10.24 Z m -61.44 145.408 l -10.24 16.384 c -4.096 6.144 -6.144 6.144 -10.24 10.24 l -12.288 -24.576 l 32.768 -2.048 Z m -49.152 77.824 c -2.048 12.288 -10.24 34.816 -14.336 55.296 c -4.096 20.48 -4.096 38.912 -6.144 59.392 c -51.2 -6.144 -118.784 -8.192 -143.36 -43.008 v -40.96 c 20.48 -47.104 6.144 -53.248 45.056 -92.16 c 20.48 -20.48 51.2 -40.96 90.112 -45.056 c 8.192 12.288 30.72 90.112 28.672 106.496 Z m 512 147.456 c -69.632 45.056 -313.344 36.864 -405.504 20.48 c -81.92 -14.336 -94.208 -30.72 -90.112 -83.968 c 8.192 -110.592 71.68 -174.08 174.08 -192.512 c 18.432 24.576 34.816 139.264 53.248 174.08 c 2.048 -22.528 8.192 -47.104 14.336 -69.632 c 12.288 -47.104 -6.144 -28.672 -6.144 -63.488 h 40.96 c 2.048 6.144 4.096 6.144 0 18.432 c 0 2.048 -8.192 14.336 -8.192 14.336 c -6.144 12.288 14.336 83.968 20.48 96.256 l 47.104 -172.032 c 102.4 20.48 165.888 75.776 182.272 188.416 c 4.096 34.816 2.048 53.248 -22.528 69.632 Z m 157.696 -47.104 c -30.72 8.192 -73.728 14.336 -106.496 14.336 c -4.096 -57.344 -20.48 -118.784 -20.48 -118.784 c 0 -8.192 10.24 -43.008 14.336 -53.248 l 18.432 -49.152 c 71.68 12.288 118.784 53.248 133.12 122.88 c 10.24 51.2 6.144 69.632 -38.912 83.968 Z" fill="#2b5deb" p-id="5487"></path></svg> cjf:<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M902.384941 257.114353H245.338353a98.454588 98.454588 0 0 0-98.454588 98.424471V746.315294a98.484706 98.484706 0 0 0 98.484706 98.454588h57.675294v141.914353c0 13.914353 16.745412 20.841412 26.593882 11.023059l152.937412-152.937412h419.84a98.484706 98.484706 0 0 0 98.42447-98.484706V355.568941a98.454588 98.454588 0 0 0-98.454588-98.42447" fill="#FF7E50"></path><path d="M98.424471 0h657.046588a98.454588 98.454588 0 0 1 98.484706 98.424471v390.806588a98.424471 98.424471 0 0 1-98.484706 98.42447H697.825882v141.914353a15.570824 15.570824 0 0 1-26.593882 11.023059l-152.997647-152.937412H98.424471A98.454588 98.454588 0 0 1 0 489.231059V98.424471A98.484706 98.484706 0 0 1 98.484706 0" fill="#F9D11F"></path><path d="M671.232 740.592941a15.600941 15.600941 0 0 0 26.624-11.023059v-141.94447h57.645176a98.394353 98.394353 0 0 0 98.424471-98.424471V257.084235H245.338353a98.424471 98.424471 0 0 0-98.424471 98.424471v232.116706h371.350589l152.967529 152.997647z" fill="#ED4042"></path><path d="M303.043765 468.269176h394.812235V358.098824H303.043765z" fill="#FFFFFF"></path></svg>
cmh:<svg viewBox="0 0 1355 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M663.491765 1002.315294c-162.454588 0-294.159059-131.734588-294.159059-294.189176V109.236706A109.236706 109.236706 0 0 1 478.569412 0h369.844706a109.236706 109.236706 0 0 1 109.236706 109.236706v598.889412c0 162.454588-131.704471 294.159059-294.159059 294.159058" fill="#31EC7C"></path><path d="M871.484235 916.148706c-114.868706 114.868706-301.116235 114.868706-416.015059 0L32.015059 492.634353a109.206588 109.206588 0 0 1 0-154.443294l261.511529-261.541647a109.206588 109.206588 0 0 1 154.443294 0l423.514353 423.454117c114.868706 114.928941 114.868706 301.176471 0 416.045177" fill="#A267F8"></path><path d="M455.499294 916.148706c-114.868706-114.868706-114.868706-301.116235 0-416.015059L879.013647 76.649412a109.206588 109.206588 0 0 1 154.443294 0l261.541647 261.541647a109.206588 109.206588 0 0 1 0 154.443294L871.514353 916.148706c-114.898824 114.868706-301.176471 114.868706-416.015059 0" fill="#F83CB6"></path><path d="M871.484235 500.133647L663.491765 292.141176l-208.022589 207.992471c-114.838588 114.868706-114.838588 301.116235 0 416.015059 114.898824 114.868706 301.176471 114.868706 416.015059 0 114.868706-114.898824 114.868706-301.146353 0-416.015059" fill="#7E42B9"></path><path d="M740.532706 636.235294a101.707294 101.707294 0 0 1-143.811765 143.811765 101.707294 101.707294 0 0 1 143.811765-143.811765" fill="#FFFFFF"></path></svg> cmh:<svg viewBox="0 0 1355 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M663.491765 1002.315294c-162.454588 0-294.159059-131.734588-294.159059-294.189176V109.236706A109.236706 109.236706 0 0 1 478.569412 0h369.844706a109.236706 109.236706 0 0 1 109.236706 109.236706v598.889412c0 162.454588-131.704471 294.159059-294.159059 294.159058" fill="#31EC7C"></path><path d="M871.484235 916.148706c-114.868706 114.868706-301.116235 114.868706-416.015059 0L32.015059 492.634353a109.206588 109.206588 0 0 1 0-154.443294l261.511529-261.541647a109.206588 109.206588 0 0 1 154.443294 0l423.514353 423.454117c114.868706 114.928941 114.868706 301.176471 0 416.045177" fill="#A267F8"></path><path d="M455.499294 916.148706c-114.868706-114.868706-114.868706-301.116235 0-416.015059L879.013647 76.649412a109.206588 109.206588 0 0 1 154.443294 0l261.541647 261.541647a109.206588 109.206588 0 0 1 0 154.443294L871.514353 916.148706c-114.898824 114.868706-301.176471 114.868706-416.015059 0" fill="#F83CB6"></path><path d="M871.484235 500.133647L663.491765 292.141176l-208.022589 207.992471c-114.838588 114.868706-114.838588 301.116235 0 416.015059 114.898824 114.868706 301.176471 114.868706 416.015059 0 114.868706-114.898824 114.868706-301.146353 0-416.015059" fill="#7E42B9"></path><path d="M740.532706 636.235294a101.707294 101.707294 0 0 1-143.811765 143.811765 101.707294 101.707294 0 0 1 143.811765-143.811765" fill="#FFFFFF"></path></svg>
ctg:<svg viewBox="0 0 1114 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M801.039059 672.677647l-198.415059 198.415059-198.415059-198.415059-155.888941-155.888941 198.415059-198.415059 155.888941 155.888941 220.16-220.129882V133.150118a133.150118 133.150118 0 0 0-133.150118-133.12H118.211765C44.664471 0 0 59.632941 0 133.12v735.954824C0 942.682353 44.664471 1002.315294 118.211765 1002.315294h571.422117a133.12 133.12 0 0 0 133.12-133.180235v-218.172235l-21.714823 21.744941z" fill="#F9D11F"></path><path d="M1105.92 367.766588l-198.384941-198.415059-84.751059 84.781177v396.8z" fill="#3193FF"></path><path d="M446.735059 318.403765L248.32 516.818824l155.888941 155.888941 198.415059 198.415059 198.415059-198.415059 21.744941-21.744941V254.132706l-220.16 220.16z" fill="#006FD9"></path><path d="M119.657412 239.344941h583.439059v-134.625882H119.657412zM119.687529 882.627765h179.501177v-134.625883h-179.501177z" fill="#FFFFFF"></path></svg> ctg:<svg viewBox="0 0 1114 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M801.039059 672.677647l-198.415059 198.415059-198.415059-198.415059-155.888941-155.888941 198.415059-198.415059 155.888941 155.888941 220.16-220.129882V133.150118a133.150118 133.150118 0 0 0-133.150118-133.12H118.211765C44.664471 0 0 59.632941 0 133.12v735.954824C0 942.682353 44.664471 1002.315294 118.211765 1002.315294h571.422117a133.12 133.12 0 0 0 133.12-133.180235v-218.172235l-21.714823 21.744941z" fill="#F9D11F"></path><path d="M1105.92 367.766588l-198.384941-198.415059-84.751059 84.781177v396.8z" fill="#3193FF"></path><path d="M446.735059 318.403765L248.32 516.818824l155.888941 155.888941 198.415059 198.415059 198.415059-198.415059 21.744941-21.744941V254.132706l-220.16 220.16z" fill="#006FD9"></path><path d="M119.657412 239.344941h583.439059v-134.625882H119.657412zM119.687529 882.627765h179.501177v-134.625883h-179.501177z" fill="#FFFFFF"></path></svg>