This commit is contained in:
parent
3e61a51ad8
commit
2b53f1cf47
|
|
@ -1,6 +1,7 @@
|
||||||
<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>
|
||||||
|
|
@ -42,6 +43,7 @@
|
||||||
</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>
|
||||||
|
|
@ -85,6 +87,7 @@
|
||||||
</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>
|
||||||
|
|
@ -102,7 +105,7 @@
|
||||||
<view class="ciy-form">
|
<view class="ciy-form">
|
||||||
<label>验证码</label>
|
<label>验证码</label>
|
||||||
<view>
|
<view>
|
||||||
<ciy-capcode hasmore name="capsms" btntxt="发送短信" :account="forgetmobile" :func="smsfunc" placeholder="请输入验证码"></ciy-capcode>
|
<ciy-capcode hasmore name="captcha" btntxt="发送短信" :account="forgetmobile" :func="smsfunc" placeholder="请输入验证码"></ciy-capcode>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="ciy-form">
|
<view class="ciy-form">
|
||||||
|
|
@ -168,7 +171,6 @@
|
||||||
.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;
|
||||||
|
|
@ -178,7 +180,6 @@
|
||||||
.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;
|
||||||
|
|
@ -204,6 +205,7 @@
|
||||||
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 {
|
||||||
|
|
@ -215,7 +217,7 @@
|
||||||
user: '',
|
user: '',
|
||||||
pass: '',
|
pass: '',
|
||||||
xieyi: false,
|
xieyi: false,
|
||||||
pg: -100, //-100
|
pg: -100,
|
||||||
ver: 6,
|
ver: 6,
|
||||||
height: '28em',
|
height: '28em',
|
||||||
tusers: [],
|
tusers: [],
|
||||||
|
|
@ -226,10 +228,9 @@
|
||||||
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) {
|
||||||
|
|
@ -249,7 +250,7 @@
|
||||||
onlyAuthorize: true
|
onlyAuthorize: true
|
||||||
});
|
});
|
||||||
var retjson = await this.callfunc({
|
var retjson = await this.callfunc({
|
||||||
func: 'login.wx_autouser',
|
func: 'login.json_wx_autouser',
|
||||||
loadhide: true,
|
loadhide: true,
|
||||||
data: {
|
data: {
|
||||||
code: res.code,
|
code: res.code,
|
||||||
|
|
@ -262,6 +263,7 @@
|
||||||
return;
|
return;
|
||||||
//#endif
|
//#endif
|
||||||
}
|
}
|
||||||
|
// 动画显示
|
||||||
var animation = uni.createAnimation({
|
var animation = uni.createAnimation({
|
||||||
timingFunction: 'ease'
|
timingFunction: 'ease'
|
||||||
});
|
});
|
||||||
|
|
@ -270,6 +272,7 @@
|
||||||
duration: 700
|
duration: 700
|
||||||
});
|
});
|
||||||
this.anidataauth = animation.export();
|
this.anidataauth = animation.export();
|
||||||
|
|
||||||
var animation = uni.createAnimation({
|
var animation = uni.createAnimation({
|
||||||
timingFunction: 'ease'
|
timingFunction: 'ease'
|
||||||
});
|
});
|
||||||
|
|
@ -278,12 +281,16 @@
|
||||||
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.sendsms';
|
this.smsfunc = 'login.json_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 == '')
|
||||||
|
|
@ -292,23 +299,33 @@
|
||||||
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);
|
|
||||||
post.pass = md5.md5(epass + post.auth);
|
// 密码加密:md5(用户输入密码MD5 + auth时间戳)
|
||||||
//._from = app.globalData._sysinfo;
|
var userPassMd5 = md5.md5(post.pass);
|
||||||
|
post.pass = md5.md5(userPassMd5 + post.auth);
|
||||||
|
|
||||||
|
// 调用登录接口
|
||||||
var retjson = await this.callfunc({
|
var retjson = await this.callfunc({
|
||||||
func: 'login.login_mobile', // login.login
|
func: 'login.json_login_mobile',
|
||||||
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 == '')
|
||||||
|
|
@ -317,24 +334,32 @@
|
||||||
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;
|
||||||
post.pass = md5.md5(post.pass + app.globalData.tokensalt);
|
// 密码加密:MD5(用户输入密码)
|
||||||
|
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.reg_mobile', // login.reg
|
func: 'login.json_reg_mobile',
|
||||||
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 == '')
|
||||||
|
|
@ -343,16 +368,24 @@
|
||||||
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.forgetpass', // login.reg
|
func: 'login.json_forgetpass',
|
||||||
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);
|
||||||
|
|
@ -361,9 +394,13 @@
|
||||||
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({
|
||||||
|
|
@ -372,6 +409,7 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.authcb = null;
|
this.authcb = null;
|
||||||
|
|
||||||
var animation = uni.createAnimation({
|
var animation = uni.createAnimation({
|
||||||
timingFunction: 'ease'
|
timingFunction: 'ease'
|
||||||
});
|
});
|
||||||
|
|
@ -380,6 +418,7 @@
|
||||||
duration: 1000
|
duration: 1000
|
||||||
});
|
});
|
||||||
this.anidataauth = animation.export();
|
this.anidataauth = animation.export();
|
||||||
|
|
||||||
var animation = uni.createAnimation({
|
var animation = uni.createAnimation({
|
||||||
timingFunction: 'ease'
|
timingFunction: 'ease'
|
||||||
});
|
});
|
||||||
|
|
@ -389,6 +428,8 @@
|
||||||
});
|
});
|
||||||
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)
|
||||||
|
|
@ -396,17 +437,94 @@
|
||||||
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.debug_list',
|
func: 'login.json_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>
|
||||||
|
|
@ -1,331 +1,280 @@
|
||||||
<template>
|
<template>
|
||||||
<ciy-header title="搜索/列表/删除页" ref="header"></ciy-header>
|
<view class="container">
|
||||||
<view v-if="init.code != 1">
|
<!-- 搜索栏(按姓名/头衔搜索) -->
|
||||||
<view class="px4 py4">
|
<view class="search my2">
|
||||||
<view style="height:2em;width:60%;" class="ciy-skeleton"></view>
|
<div class="flex flex-center">
|
||||||
<view style="height:1em;width:40%;margin-left:1em;" class="ciy-skeleton"></view>
|
<input
|
||||||
<view style="height:1em;width:50%;" class="ciy-skeleton"></view>
|
type="text"
|
||||||
<view style="height:6em;width:100%;" class="ciy-skeleton"></view>
|
v-model="searchKey"
|
||||||
</view>
|
placeholder="请输入姓名/头衔搜索"
|
||||||
</view>
|
class="flex1 px2 py1"
|
||||||
<view v-else>
|
@confirm="getList"
|
||||||
<view class="sti" :style="{top:(header_statusbar_height+header_title_height)+'px'}">
|
/>
|
||||||
<ciy-segment :lis="init.lis" all="全部" @change="segment_change"></ciy-segment>
|
<button class="btn man ml2" @click="getList">搜索</button>
|
||||||
<ciy-query ref="query" :gdict="g" :qry="init.searchinput" @confirm="query_confirm">
|
</div>
|
||||||
<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>
|
||||||
|
|
||||||
<view class="ciy-hr"></view>
|
<!-- 新增按钮 -->
|
||||||
<view class="l2">审核人 {{ccode('xa_user', item.audituser)}}</view>
|
<button class="btn succ my2" @click="goToEdit">新增成员</button>
|
||||||
<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>
|
<div class="table bg1 rounded">
|
||||||
<view>{{ccode(init.zc_menu, item.menuid)}}</view>
|
<!-- 表头 -->
|
||||||
</view>
|
<div class="flex bg5 txt6 py2 px2">
|
||||||
<view class="l2">
|
<div class="col-3 txt-center">头像</div>
|
||||||
<label>文件大小</label>
|
<div class="col-4 txt-center">姓名</div>
|
||||||
<view>{{tofix(item.filesize/1024, -2)}}KB</view>
|
<div class="col-4 txt-center">手机号</div>
|
||||||
</view>
|
<div class="col-4 txt-center">头衔</div>
|
||||||
<view class="l2">
|
<div class="col-4 txt-center">状态</div>
|
||||||
<label>长度</label>
|
<div class="col-3 txt-center">性别</div>
|
||||||
<view>{{tofix(item.metre/1000, -2)}}米</view>
|
<div class="col-3 txt-center">学历</div>
|
||||||
</view>
|
<div class="col-3 txt-center">操作</div>
|
||||||
<view class="l2">
|
</div>
|
||||||
<label>贷款金额</label>
|
|
||||||
<view>{{tofix(item.bankmoney/1000000)}}万元</view>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<view class="l2">
|
<!-- 列表内容 -->
|
||||||
<label>设置日期</label>
|
<div class="list" v-if="list.length > 0">
|
||||||
<view>{{todatetime(item.setdate, 'd')}}</view>
|
<div
|
||||||
</view>
|
class="flex py2 px2 border-b border-bg6"
|
||||||
<view class="l2">
|
v-for="item in list"
|
||||||
<label>设置时间</label>
|
:key="item.id"
|
||||||
<view>{{todatetime(item.settimes)}}</view>
|
>
|
||||||
</view>
|
<div class="col-3 txt-center">
|
||||||
<view class="l2">
|
<image :src="item.avatar" mode="aspectFill" class="w-10 h-10 rounded-full"></image>
|
||||||
<label>营业时间</label>
|
</div>
|
||||||
<view>{{totimepoint(item.dayclock, true)}}</view>
|
<div class="col-4 txt-center">{{ item.name }}</div>
|
||||||
</view>
|
<div class="col-4 txt-center">{{ item.mobile }}</div>
|
||||||
<ciy-showimgs label="文档" :src="item.downurl"></ciy-showimgs>
|
<div class="col-4 txt-center">{{ getTitleText(item.usertitle) }}</div>
|
||||||
<ciy-showimgs :src="item.avar" width="20em" mode="widthFix"></ciy-showimgs>
|
<div class="col-4 txt-center">
|
||||||
|
<span :class="getStatusTagClass(item.stpstatus)">{{ getStatusText(item.stpstatus) }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="col-3 txt-center">{{ getSexText(item.sex) }}</div>
|
||||||
|
<div class="col-3 txt-center">{{ getEducationText(item.education) }}</div>
|
||||||
|
<div class="col-3 txt-center flex flex-center justify-center gap2">
|
||||||
|
<button class="btn def sm" @click.stop="goToEdit(item.id)">编辑</button>
|
||||||
|
<button class="btn dag sm" @click.stop="delMember(item.id)">删除</button>
|
||||||
|
<button
|
||||||
|
class="btn sm"
|
||||||
|
:class="item.stpstatus === 30 ? 'warn' : 'succ'"
|
||||||
|
@click.stop="auditMember(item.id, item.stpstatus === 30 ? 40 : 30)"
|
||||||
|
>
|
||||||
|
{{ item.stpstatus === 30 ? '设为历史' : '设为在册' }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<view class="l2">
|
<!-- 空数据提示 -->
|
||||||
<label>是否使用</label>
|
<div class="txt-center py10 txt3" v-if="list.length === 0">
|
||||||
<view>{{item.isuse==1?'√':'×'}}</view>
|
暂无成员数据
|
||||||
</view>
|
</div>
|
||||||
<view class="l2">
|
</div>
|
||||||
<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>
|
<div class="table page flex justify-end mt2" v-if="total > pageSize">
|
||||||
<view>{{tocyc(item.npcyc)}}</view>
|
<button
|
||||||
</view>
|
class="btn def sm mr1"
|
||||||
<view class="l2">
|
@click="page--; getList()"
|
||||||
<label>执行用时</label>
|
:disabled="page <= 1"
|
||||||
<view>{{totimesec(item.runsec)}}</view>
|
>上一页</button>
|
||||||
</view>
|
<span class="px2">{{ page }} / {{ Math.ceil(total / pageSize) }}</span>
|
||||||
<view class="l2">
|
<button
|
||||||
<label>活动期数</label>
|
class="btn def sm ml1"
|
||||||
<view>第{{item.acttm}}期</view>
|
@click="page++; getList()"
|
||||||
</view>
|
:disabled="page >= Math.ceil(total / pageSize)"
|
||||||
<ciy-showimgs label="活动花絮" :src="item.imgs"></ciy-showimgs>
|
>下一页</button>
|
||||||
<view class="l2">
|
</div>
|
||||||
<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>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {}
|
return {
|
||||||
|
list: [], // 成员列表
|
||||||
|
searchKey: '', // 搜索关键词(姓名/头衔)
|
||||||
|
page: 1, // 当前页码
|
||||||
|
pageSize: 15, // 每页条数
|
||||||
|
total: 0, // 总条数
|
||||||
|
|
||||||
|
// 字典映射(严格匹配后台字典)
|
||||||
|
sexMap: {
|
||||||
|
10: '男',
|
||||||
|
20: '女',
|
||||||
|
90: '其他'
|
||||||
},
|
},
|
||||||
onLoad() {
|
titleMap: {
|
||||||
this.load_ciydict(this.file_stor('/dict/ciy_arearpc.js')).then(json => {
|
10: '主任',
|
||||||
if (json.code != 1)
|
20: '副主任',
|
||||||
return this.alert(json.errmsg);
|
30: '顾问',
|
||||||
this.g.ciy_arearpc = json.arr;
|
40: '名誉主任',
|
||||||
});
|
50: '教授',
|
||||||
this.getlist();
|
60: '副教授',
|
||||||
|
70: '讲师',
|
||||||
|
80: '研究员'
|
||||||
},
|
},
|
||||||
onReachBottom(b) {
|
statusMap: {
|
||||||
console.log('onReachBottom page', this.pageno);
|
10: '负责人',
|
||||||
if (this.init.code != 1)
|
20: '科研秘书',
|
||||||
return;
|
30: '在册成员',
|
||||||
this.getlist();
|
40: '历史成员',
|
||||||
|
50: '外部成员'
|
||||||
},
|
},
|
||||||
onPullDownRefresh(b) {
|
educationMap: {
|
||||||
console.log('onPullDownRefresh page');
|
50: '本科',
|
||||||
this.pageno = 0;
|
60: '硕士',
|
||||||
this._stopPullDown = true;
|
70: '博士'
|
||||||
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) {
|
onLoad() {
|
||||||
if (await this.askmsg('是否删除?', '删除') != 'ok')
|
this.getList();
|
||||||
return;
|
},
|
||||||
var retjson = await this.callfunc({
|
methods: {
|
||||||
func: 'demo/demo.del',
|
// 获取成员列表(按姓名/头衔搜索)
|
||||||
|
async getList() {
|
||||||
|
try {
|
||||||
|
const res = await uni.request({
|
||||||
|
url: '/web/ambap/member.php',
|
||||||
|
method: 'POST',
|
||||||
data: {
|
data: {
|
||||||
id: item.data.id
|
act: 'member.list',
|
||||||
|
page: this.page,
|
||||||
|
pageSize: this.pageSize,
|
||||||
|
searchKey: this.searchKey, // 后台接收该参数,同时匹配姓名/头衔
|
||||||
|
searchType: 'name,title' // 明确搜索类型:姓名+头衔
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (retjson.code != 1)
|
|
||||||
return this.alert(retjson.errmsg);
|
if (res.data.code === 1) {
|
||||||
this.init.list[item.data._idx]._del = true;
|
this.list = res.data.list;
|
||||||
setTimeout(() => {
|
this.total = res.data.total;
|
||||||
this.init.list.splice(item.data._idx, 1);
|
} else {
|
||||||
}, 500);
|
uni.showToast({
|
||||||
|
title: res.data.errmsg || '获取列表失败',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '网络错误',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
console.error('获取列表失败:', err);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
async audit(item) {
|
|
||||||
var msg = await this.inputmsg({
|
// 跳转到编辑页
|
||||||
title: '请填写审核理由',
|
goToEdit(id) {
|
||||||
ele: 'textarea'
|
uni.navigateTo({
|
||||||
}, [{
|
url: `/pages/lab/useredit?id=${id || ''}`
|
||||||
name: '审核通过',
|
});
|
||||||
btn: 'ok'
|
},
|
||||||
}, {
|
|
||||||
name: '驳回',
|
// 删除成员
|
||||||
btn: 'ng',
|
async delMember(id) {
|
||||||
cls: 'dag liner'
|
const confirm = await uni.showModal({
|
||||||
}, {
|
title: '提示',
|
||||||
name: '取消',
|
content: '确定要删除该成员吗?'
|
||||||
btn: 'cancel',
|
});
|
||||||
cls: 'def'
|
|
||||||
}]);
|
if (!confirm.confirm) return;
|
||||||
if (msg.btn == 'cancel')
|
|
||||||
return;
|
try {
|
||||||
var retjson = await this.callfunc({
|
const res = await uni.request({
|
||||||
func: 'demo/demo.audit',
|
url: '/web/ambap/member.php',
|
||||||
|
method: 'POST',
|
||||||
data: {
|
data: {
|
||||||
id: item.data.id,
|
act: 'member.del',
|
||||||
msg: msg.text,
|
id: id
|
||||||
status: msg.btn == 'ng' ? 90 : 100,
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (retjson.code != 1)
|
|
||||||
return this.alert(retjson.errmsg);
|
if (res.data.code === 1) {
|
||||||
this.init.list[item.data._idx] = this.objdeepmerge(this.init.list[item.data._idx], retjson.data);
|
uni.showToast({
|
||||||
|
title: '删除成功',
|
||||||
|
icon: 'success'
|
||||||
|
});
|
||||||
|
this.getList();
|
||||||
|
} else {
|
||||||
|
uni.showToast({
|
||||||
|
title: res.data.errmsg || '删除失败',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '网络错误',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
console.error('删除失败:', err);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
showmenu(idx) {
|
|
||||||
var dat = this.init.list[idx];
|
// 切换成员状态
|
||||||
dat._idx = idx;
|
async auditMember(id, status) {
|
||||||
var items = [];
|
try {
|
||||||
items.push({
|
const res = await uni.request({
|
||||||
func: 'audit',
|
url: '/web/ambap/member.php',
|
||||||
name: '审核',
|
method: 'POST',
|
||||||
data: dat
|
data: {
|
||||||
|
act: 'member.audit',
|
||||||
|
id: id,
|
||||||
|
status: status
|
||||||
|
}
|
||||||
});
|
});
|
||||||
items.push({
|
|
||||||
func: 'edit',
|
if (res.data.code === 1) {
|
||||||
name: '变更',
|
uni.showToast({
|
||||||
data: dat
|
title: '操作成功',
|
||||||
|
icon: 'success'
|
||||||
});
|
});
|
||||||
items.push({
|
this.getList();
|
||||||
func: 'del',
|
} else {
|
||||||
name: '删除',
|
uni.showToast({
|
||||||
style: 'color:var(--dag5)',
|
title: res.data.errmsg || '操作失败',
|
||||||
data: dat
|
icon: 'none'
|
||||||
});
|
|
||||||
this.popmenu({
|
|
||||||
items
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
} catch (err) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '网络错误',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
console.error('状态切换失败:', err);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 性别文本转换
|
||||||
|
getSexText(sex) {
|
||||||
|
return this.sexMap[sex] || '未知';
|
||||||
|
},
|
||||||
|
|
||||||
|
// 头衔文本转换
|
||||||
|
getTitleText(title) {
|
||||||
|
return this.titleMap[title] || '未知头衔';
|
||||||
|
},
|
||||||
|
|
||||||
|
// 状态文本转换
|
||||||
|
getStatusText(status) {
|
||||||
|
return this.statusMap[status] || '未知状态';
|
||||||
|
},
|
||||||
|
|
||||||
|
// 状态标签样式
|
||||||
|
getStatusTagClass(status) {
|
||||||
|
switch(status) {
|
||||||
|
case 10: return 'cata_man'; // 负责人-主色
|
||||||
|
case 20: return 'cata_warn'; // 科研秘书-警示色
|
||||||
|
case 30: return 'cata_succ'; // 在册成员-成功色
|
||||||
|
case 40: return 'cata_def'; // 历史成员-默认色
|
||||||
|
case 50: return 'cata_dag'; // 外部成员-失败色
|
||||||
|
default: return 'cata_def';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 学历文本转换
|
||||||
|
getEducationText(edu) {
|
||||||
|
return this.educationMap[edu] || '未知学历';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -38,5 +38,15 @@ export default defineConfig({
|
||||||
scss: {},
|
scss: {},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
server: {},
|
server: {
|
||||||
|
// 仅新增这一段代理配置,其他保持不变
|
||||||
|
port: 5173, // 保留你原本的5173端口
|
||||||
|
proxy: {
|
||||||
|
'/ambap': { // 转发/ambap开头的请求到Nginx
|
||||||
|
target: 'https://labsci.local.ciy.cn', // 你的Nginx域名
|
||||||
|
changeOrigin: true, // 允许跨域
|
||||||
|
secure: false // 忽略HTTPS证书校验(本地开发必加)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
Navicat Premium Data Transfer
|
||||||
|
|
||||||
|
Source Server : ryx
|
||||||
|
Source Server Type : MariaDB
|
||||||
|
Source Server Version : 100510
|
||||||
|
Source Host : localhost:3307
|
||||||
|
Source Schema : c5_labsci
|
||||||
|
|
||||||
|
Target Server Type : MariaDB
|
||||||
|
Target Server Version : 100510
|
||||||
|
File Encoding : 65001
|
||||||
|
|
||||||
|
Date: 26/01/2026 15:46:45
|
||||||
|
*/
|
||||||
|
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for lab_user
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `lab_user`;
|
||||||
|
CREATE TABLE `lab_user` (
|
||||||
|
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||||
|
`laborgid` bigint(20) NOT NULL COMMENT '所属机构,DB,lab_orgbase',
|
||||||
|
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名',
|
||||||
|
`usertitle` int(11) NOT NULL COMMENT '头衔,CATA,usertitle',
|
||||||
|
`education` int(11) NOT NULL COMMENT '学历,CATA,education',
|
||||||
|
`sn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编号',
|
||||||
|
`sex` int(11) NOT NULL COMMENT '性别,CATA,sex',
|
||||||
|
`addtimes` bigint(20) NOT NULL COMMENT '加入日期,DATE,Y-m-d',
|
||||||
|
`mobile` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '手机号,MSK,****',
|
||||||
|
`email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '信箱',
|
||||||
|
`password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT ',密码',
|
||||||
|
`stpstatus` int(11) NOT NULL COMMENT '|状态|,CATA,stpstatus',
|
||||||
|
`userlevel` int(11) NOT NULL COMMENT '|等级|,CATA,userlevel',
|
||||||
|
`totalpnt` bigint(20) NOT NULL COMMENT '总积分|,INT',
|
||||||
|
`dvotecnt` bigint(20) NOT NULL COMMENT '互动贡献|,INT,次',
|
||||||
|
`trytime` int(11) NOT NULL DEFAULT 0 COMMENT ',密码重试次数',
|
||||||
|
`logintimes` bigint(20) NOT NULL COMMENT '登录时间,DATE',
|
||||||
|
`sid` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT ',授权码',
|
||||||
|
`exptimes` bigint(20) NOT NULL COMMENT ',授权过期时间,DATE',
|
||||||
|
`ip` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '#登录IP,IP',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '实验室成员' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of lab_user
|
||||||
|
-- ----------------------------
|
||||||
|
|
||||||
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
|
@ -15,6 +15,8 @@ class login {
|
||||||
}
|
}
|
||||||
return succjson();
|
return succjson();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 登录接口 - 去掉权限限制 + 匹配前端MD5加密逻辑
|
||||||
public static function json_login_mobile() {
|
public static function json_login_mobile() {
|
||||||
global $db;
|
global $db;
|
||||||
global $_token;
|
global $_token;
|
||||||
|
|
@ -22,42 +24,57 @@ class login {
|
||||||
$model = $post->get('model');
|
$model = $post->get('model');
|
||||||
$appcid = $post->get('appcid');
|
$appcid = $post->get('appcid');
|
||||||
$user = $post->get('user');
|
$user = $post->get('user');
|
||||||
|
|
||||||
if (empty($user))
|
if (empty($user))
|
||||||
return errjson('请填写用户名');
|
return errjson('请填写用户名');
|
||||||
|
|
||||||
$csql = new \ciy\sql('lab_user');
|
$csql = new \ciy\sql('lab_user');
|
||||||
$csql->where('mobile', $user);
|
$csql->where('mobile', $user);
|
||||||
$rsuser = $db->getone($csql);
|
$rsuser = $db->getone($csql);
|
||||||
|
|
||||||
if ($rsuser === false)
|
if ($rsuser === false)
|
||||||
return errjson($db->error);
|
return errjson($db->error);
|
||||||
|
|
||||||
if (!is_array($rsuser)) {
|
if (!is_array($rsuser)) {
|
||||||
savelog($db, 0, 'LOGINERR', '用户[' . $user . ']不存在,在尝试登录');
|
savelog($db, 0, 'LOGINERR', '用户[' . $user . ']不存在,在尝试登录');
|
||||||
return errjson('用户名不存在');
|
return errjson('用户名不存在');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 去掉状态权限限制 - 所有用户均可登录
|
||||||
|
// 注释掉原有的stpstatus校验逻辑
|
||||||
|
// if (!in_array($rsuser['stpstatus'], [10, 30, 50])) {
|
||||||
|
// savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']被禁用,在尝试登录');
|
||||||
|
// return errjson('您的账户已经被禁用.');
|
||||||
|
// }
|
||||||
|
|
||||||
|
// 密码错误次数限制(可选保留,如需关闭可注释)
|
||||||
if ($rsuser['trytime'] > 10) {
|
if ($rsuser['trytime'] > 10) {
|
||||||
if (tostamp() - $rsuser['logintimes'] < 600) {
|
if (tostamp() - $rsuser['logintimes'] < 600) {
|
||||||
savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']登录连续失败');
|
savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']登录连续失败');
|
||||||
return errjson('连续输入密码错误,10分钟后再来登录.');
|
return errjson('连续输入密码错误,10分钟后再来登录.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($rsuser['stpstatus'] != 10) {
|
|
||||||
savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']被禁用,在尝试登录');
|
|
||||||
return errjson('您的账户已经被禁用.');
|
|
||||||
}
|
|
||||||
$authtime = $post->getint('auth');
|
$authtime = $post->getint('auth');
|
||||||
if (abs($authtime / 1000 - tostamp()) > 300)
|
$authSec = $authtime / 1000;
|
||||||
return errjson('您的本地时间与服务器时间相差超过5分钟,请调整本机时间。<br/>服务器时间: ' . date('Y-m-d H:i:s') . '<br/>您本机时间: ' . date('Y-m-d H:i:s', (int)($authtime / 1000)));
|
// 时间戳校验(兼容毫秒级)
|
||||||
// if($user == '1')
|
if (abs($authSec - tostamp()) > 300)
|
||||||
// clog(md5('1' . $_token['salt'])); //开发生成默认密码
|
return errjson('您的本地时间与服务器时间相差超过5分钟,请调整本机时间。<br/>服务器时间: ' . date('Y-m-d H:i:s') . '<br/>您本机时间: ' . date('Y-m-d H:i:s', (int)$authSec));
|
||||||
if ($post->get('pass') != md5($rsuser['password'] . $authtime)) {
|
|
||||||
|
// 密码校验:匹配前端加密逻辑 md5(数据库存储的MD5密码 + auth时间戳)
|
||||||
|
$checkPass = md5($rsuser['password'] . $authtime);
|
||||||
|
if ($post->get('pass') != $checkPass) {
|
||||||
$updata = array();
|
$updata = array();
|
||||||
$updata['trytime'] = array('trytime+1');
|
$updata['trytime'] = array('trytime+1');
|
||||||
$updata['logintimes'] = tostamp();
|
$updata['logintimes'] = tostamp();
|
||||||
$csql = new \ciy\sql('lab_user');
|
$csql = new \ciy\sql('lab_user');
|
||||||
$csql->where('id', $rsuser['id']);
|
$csql->where('id', $rsuser['id']);
|
||||||
$db->update($csql, $updata);
|
$db->update($csql, $updata);
|
||||||
savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']登录密码错误' . md5('1' . $_token['salt']));
|
savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']登录密码错误');
|
||||||
return errjson('用户名或密码错误.');
|
return errjson('用户名或密码错误.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 登录成功 - 更新用户状态
|
||||||
$sid = randstr(10);
|
$sid = randstr(10);
|
||||||
$exp = tostamp() + $_token['swapsec'];
|
$exp = tostamp() + $_token['swapsec'];
|
||||||
$id = $rsuser['id'];
|
$id = $rsuser['id'];
|
||||||
|
|
@ -67,14 +84,16 @@ class login {
|
||||||
$updata['sid'] = $sid;
|
$updata['sid'] = $sid;
|
||||||
$updata['exptimes'] = $exp;
|
$updata['exptimes'] = $exp;
|
||||||
$updata['ip'] = getip();
|
$updata['ip'] = getip();
|
||||||
|
|
||||||
$csql = new \ciy\sql('lab_user');
|
$csql = new \ciy\sql('lab_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);
|
||||||
|
|
||||||
|
|
||||||
self::savelug($db, 1, $rsuser['id'], $model);
|
self::savelug($db, 1, $rsuser['id'], $model);
|
||||||
$ret = self::getsync($rsuser, $sid);
|
$ret = self::getsync($rsuser, $sid);
|
||||||
|
|
||||||
|
// 调试用户逻辑
|
||||||
$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->where('isuse', 1);
|
||||||
|
|
@ -87,55 +106,59 @@ class login {
|
||||||
}
|
}
|
||||||
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');
|
||||||
$upid = $post->getint('upid');
|
|
||||||
$user = $post->get('user');
|
$user = $post->get('user');
|
||||||
$pass = $post->get('pass');
|
$pass = $post->get('pass');
|
||||||
|
|
||||||
if (empty($user))
|
if (empty($user))
|
||||||
return errjson('请填写手机号');
|
return errjson('请填写手机号');
|
||||||
if (empty($pass))
|
if (empty($pass))
|
||||||
return errjson('请填写密码');
|
return errjson('请填写密码');
|
||||||
$csql = new \ciy\sql('ap_user');
|
|
||||||
|
$csql = new \ciy\sql('lab_user');
|
||||||
$csql->where('mobile', $user);
|
$csql->where('mobile', $user);
|
||||||
$rsuser = $db->getone($csql);
|
$rsuser = $db->getone($csql);
|
||||||
|
|
||||||
if ($rsuser === false)
|
if ($rsuser === false)
|
||||||
return errjson($db->error);
|
return errjson($db->error);
|
||||||
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'];
|
||||||
$rsuser = array();
|
$rsuser = array();
|
||||||
$rsuser['upid'] = $upid;
|
$rsuser['stpstatus'] = 30; // 任意状态均可登录(已去掉限制)
|
||||||
$rsuser['stpstatus'] = 10;
|
|
||||||
$rsuser['userlevel'] = 10;
|
$rsuser['userlevel'] = 10;
|
||||||
$rsuser['name'] = ':' . substr($user, -4);
|
$rsuser['name'] = ':' . substr($user, -4);
|
||||||
$rsuser['mobile'] = $user;
|
$rsuser['mobile'] = $user;
|
||||||
$rsuser['password'] = $pass;
|
$rsuser['password'] = $pass; // 存储前端传递的MD5密码
|
||||||
$rsuser['myinvmoney'] = 0;
|
|
||||||
$rsuser['mycashmoney'] = 0;
|
|
||||||
$rsuser['mybondmoney'] = 0;
|
|
||||||
$rsuser['mypnt'] = 0;
|
|
||||||
$rsuser['trytime'] = 0;
|
$rsuser['trytime'] = 0;
|
||||||
$rsuser['logintimes'] = tostamp();
|
$rsuser['logintimes'] = tostamp();
|
||||||
$rsuser['addtimes'] = tostamp();
|
$rsuser['addtimes'] = tostamp();
|
||||||
$rsuser['icon'] = '';
|
|
||||||
$rsuser['memo'] = '';
|
|
||||||
$rsuser['power'] = '';
|
|
||||||
$rsuser['sid'] = $sid;
|
$rsuser['sid'] = $sid;
|
||||||
$rsuser['exptimes'] = $exp;
|
$rsuser['exptimes'] = $exp;
|
||||||
$rsuser['accounttimes'] = tostamp() + 86400 * 3;
|
|
||||||
$rsuser['ip'] = getip();
|
$rsuser['ip'] = getip();
|
||||||
$csql = new \ciy\sql('ap_user');
|
$rsuser['laborgid'] = 0;
|
||||||
|
$rsuser['usertitle'] = 0;
|
||||||
|
$rsuser['sn'] = '';
|
||||||
|
$rsuser['sex'] = 0;
|
||||||
|
$rsuser['totalpnt'] = 0;
|
||||||
|
$rsuser['dvotecnt'] = 0;
|
||||||
|
$rsuser['email'] = '';
|
||||||
|
|
||||||
|
$csql = new \ciy\sql('lab_user');
|
||||||
if ($db->insert($csql, $rsuser) === false)
|
if ($db->insert($csql, $rsuser) === false)
|
||||||
return errjson('注册用户失败:' . $db->error);
|
return errjson('注册用户失败:' . $db->error);
|
||||||
$id = $db->insert_id();
|
$id = $db->insert_id();
|
||||||
$rsuser['id'] = $id;
|
$rsuser['id'] = $id;
|
||||||
|
|
||||||
if (!empty($appcid)) {
|
if (!empty($appcid)) {
|
||||||
$updata = array();
|
$updata = array();
|
||||||
$updata['id'] = $id;
|
$updata['id'] = $id;
|
||||||
|
|
@ -144,12 +167,12 @@ class login {
|
||||||
if ($db->insert($csql, $updata) === false)
|
if ($db->insert($csql, $updata) === false)
|
||||||
return errjson('更新appcid失败:' . $db->error);
|
return errjson('更新appcid失败:' . $db->error);
|
||||||
}
|
}
|
||||||
if ($upid > 0) {
|
|
||||||
//上级用户统计
|
|
||||||
}
|
|
||||||
self::savelug($db, 1, $rsuser['id'], '手机注册:' . $model);
|
self::savelug($db, 1, $rsuser['id'], '手机注册:' . $model);
|
||||||
return self::getsync($rsuser, $sid);
|
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;
|
||||||
|
|
@ -158,6 +181,7 @@ 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);
|
||||||
|
|
||||||
|
|
@ -168,7 +192,8 @@ 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)
|
||||||
|
|
@ -182,12 +207,13 @@ 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']))
|
||||||
|
|
@ -210,10 +236,12 @@ 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;
|
||||||
|
|
@ -224,17 +252,11 @@ 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;
|
||||||
|
|
@ -242,8 +264,9 @@ 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('capsms');
|
$code = $post->get('captcha');
|
||||||
$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))
|
||||||
|
|
@ -251,23 +274,28 @@ class login {
|
||||||
if (empty($pass))
|
if (empty($pass))
|
||||||
return errjson('请填写密码');
|
return errjson('请填写密码');
|
||||||
|
|
||||||
$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('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');
|
||||||
|
|
@ -277,41 +305,49 @@ 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;
|
$updata['password'] = $pass; // 存储MD5密码
|
||||||
$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() - 1);
|
$csql->where('addtimes>', tostamp() - 60);
|
||||||
$cnt = $db->get1($csql);
|
$cnt = $db->get1($csql);
|
||||||
|
|
||||||
if ($cnt > 0)
|
if ($cnt > 0)
|
||||||
return errjson('验证码发送频繁,请1分钟后再尝试');
|
return errjson('验证码发送频繁,请1分钟后再尝试');
|
||||||
|
|
||||||
|
|
@ -322,9 +358,11 @@ 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;
|
||||||
|
|
@ -334,47 +372,57 @@ 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); //Cookie方式,安全性好
|
header($headercookie);
|
||||||
} else {
|
} else {
|
||||||
$ret['_ciyauth'] = $enauth; //Localstorage方式,兼容性更好
|
$ret['_ciyauth'] = $enauth;
|
||||||
//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']['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']['mobile'] = $userrow['mobile'];
|
$ret['me']['mobile'] = $userrow['mobile'];
|
||||||
|
|
@ -382,8 +430,11 @@ class login {
|
||||||
$ret['me']['dvotecnt'] = $userrow['dvotecnt'];
|
$ret['me']['dvotecnt'] = $userrow['dvotecnt'];
|
||||||
$ret['me']['needpass'] = empty($userrow['password']);
|
$ret['me']['needpass'] = empty($userrow['password']);
|
||||||
$ret['me']['cciy'] = '';
|
$ret['me']['cciy'] = '';
|
||||||
|
|
||||||
return succjson($ret);
|
return succjson($ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 退出登录
|
||||||
public static function json_logout() {
|
public static function json_logout() {
|
||||||
global $db;
|
global $db;
|
||||||
$rsuser = verifyuser();
|
$rsuser = verifyuser();
|
||||||
|
|
@ -392,38 +443,50 @@ 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);
|
||||||
|
|
@ -432,36 +495,43 @@ 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'); //android,ios,harmony
|
$cplat = $post->get('plat');
|
||||||
$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';
|
||||||
}
|
}
|
||||||
|
|
@ -469,6 +539,19 @@ 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;
|
||||||
|
|
@ -476,6 +559,7 @@ 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;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,313 @@
|
||||||
|
<?php
|
||||||
|
namespace web\ambap;
|
||||||
|
|
||||||
|
// 确保引入必要的工具类(根据实际项目路径调整)
|
||||||
|
require_once dirname(__FILE__) . '/../../ciy/db.php';
|
||||||
|
require_once dirname(__FILE__) . '/../../ciy/post.php';
|
||||||
|
require_once dirname(__FILE__) . '/../../ciy/sql.php';
|
||||||
|
|
||||||
|
class member {
|
||||||
|
// 接口入口:通过 act 参数路由到不同方法
|
||||||
|
public static function index() {
|
||||||
|
// 1. 解决跨域问题
|
||||||
|
header("Access-Control-Allow-Origin: *");
|
||||||
|
header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
|
||||||
|
header("Access-Control-Allow-Headers: Content-Type, X-Requested-With");
|
||||||
|
header("Content-Type: application/json; charset=utf-8");
|
||||||
|
|
||||||
|
// 处理 OPTIONS 预检请求
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
||||||
|
http_response_code(200);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 安全获取 act 参数
|
||||||
|
$act = isset($_REQUEST['act']) ? trim($_REQUEST['act']) : '';
|
||||||
|
switch($act) {
|
||||||
|
case 'member.list':
|
||||||
|
self::json_list();
|
||||||
|
break;
|
||||||
|
case 'member.add':
|
||||||
|
self::json_add();
|
||||||
|
break;
|
||||||
|
case 'member.edit':
|
||||||
|
self::json_edit();
|
||||||
|
break;
|
||||||
|
case 'member.detail':
|
||||||
|
self::json_detail();
|
||||||
|
break;
|
||||||
|
case 'member.del':
|
||||||
|
self::json_del();
|
||||||
|
break;
|
||||||
|
case 'member.audit':
|
||||||
|
self::json_audit();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
self::err('无效的接口动作:' . $act);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. 获取成员列表(适配当前 db.php 的 ciy\sql 语法)
|
||||||
|
public static function json_list() {
|
||||||
|
global $db;
|
||||||
|
$post = new \ciy\post();
|
||||||
|
$page = $post->getint('page', 1);
|
||||||
|
$pageSize = $post->getint('pageSize', 15);
|
||||||
|
$offset = ($page - 1) * $pageSize;
|
||||||
|
|
||||||
|
// 构建查询条件(通过 ciy\sql 的构造参数指定字段)
|
||||||
|
$csql = new \ciy\sql('lab_user', 'id, name, mobile, usertitle, stpstatus, sex, education, email, avatar, addtimes');
|
||||||
|
$csql->limit($offset, $pageSize); // 分页:偏移量、每页条数
|
||||||
|
$csql->order('addtimes DESC');
|
||||||
|
|
||||||
|
// 核心修改:使用 db.php 的 get 方法($rowcount=-1 自动查总数)
|
||||||
|
$rowcount = -1;
|
||||||
|
$list = $db->get($csql, $rowcount);
|
||||||
|
|
||||||
|
// 处理查询失败
|
||||||
|
if ($list === false) {
|
||||||
|
return self::err('获取列表失败:' . $db->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 格式化返回数据
|
||||||
|
$retList = [];
|
||||||
|
foreach ($list as $item) {
|
||||||
|
$retList[] = [
|
||||||
|
'id' => intval($item['id']),
|
||||||
|
'name' => $item['name'] ?? '',
|
||||||
|
'mobile' => $item['mobile'] ?? '',
|
||||||
|
'usertitle' => intval($item['usertitle']),
|
||||||
|
'stpstatus' => intval($item['stpstatus']),
|
||||||
|
'sex' => intval($item['sex']),
|
||||||
|
'education' => intval($item['education'] ?? 50),
|
||||||
|
'email' => $item['email'] ?? '',
|
||||||
|
'avatar' => $item['avatar'] ?? '/static/avatar-default.png',
|
||||||
|
'addtimes' => intval($item['addtimes'])
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode([
|
||||||
|
'code' => 1,
|
||||||
|
'list' => $retList,
|
||||||
|
'total' => $rowcount,
|
||||||
|
'page' => $page,
|
||||||
|
'pageSize' => $pageSize
|
||||||
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 新增成员(适配当前 db.php)
|
||||||
|
public static function json_add() {
|
||||||
|
global $db;
|
||||||
|
$post = new \ciy\post();
|
||||||
|
|
||||||
|
// 获取表单数据
|
||||||
|
$name = trim($post->get('name', ''));
|
||||||
|
$mobile = trim($post->get('mobile', ''));
|
||||||
|
$usertitle = $post->getint('usertitle', 10);
|
||||||
|
$stpstatus = $post->getint('stpstatus', 30);
|
||||||
|
$sex = $post->getint('sex', 90);
|
||||||
|
$education = $post->getint('education', 50);
|
||||||
|
$email = trim($post->get('email', ''));
|
||||||
|
$password = trim($post->get('password', ''));
|
||||||
|
|
||||||
|
// 基础验证
|
||||||
|
if (empty($name)) return self::err('请输入姓名');
|
||||||
|
if (empty($mobile)) return self::err('请输入手机号');
|
||||||
|
if (!preg_match('/^1[3-9]\d{9}$/', $mobile)) return self::err('手机号格式错误');
|
||||||
|
if (empty($password)) return self::err('请设置密码');
|
||||||
|
if (strlen($password) < 6) return self::err('密码长度不少于6位');
|
||||||
|
|
||||||
|
// 检查手机号是否已注册
|
||||||
|
$csql = new \ciy\sql('lab_user', 'id');
|
||||||
|
$csql->where('mobile', $mobile);
|
||||||
|
$exist = $db->getone($csql);
|
||||||
|
if (is_array($exist)) return self::err('该手机号已注册:' . $mobile);
|
||||||
|
|
||||||
|
// 组装数据
|
||||||
|
$data = [
|
||||||
|
'name' => $name,
|
||||||
|
'mobile' => $mobile,
|
||||||
|
'usertitle' => $usertitle,
|
||||||
|
'stpstatus' => $stpstatus,
|
||||||
|
'sex' => $sex,
|
||||||
|
'education' => $education,
|
||||||
|
'email' => $email,
|
||||||
|
'password' => $password,
|
||||||
|
'userlevel' => 10,
|
||||||
|
'trytime' => 0,
|
||||||
|
'logintimes' => self::tostamp(),
|
||||||
|
'addtimes' => self::tostamp(),
|
||||||
|
'ip' => self::getip(),
|
||||||
|
'laborgid' => 1,
|
||||||
|
'sn' => 'LAB-' . date('Ymd') . '-' . rand(1000, 9999),
|
||||||
|
'totalpnt' => 0,
|
||||||
|
'dvotecnt' => 0,
|
||||||
|
'updatetime' => self::tostamp()
|
||||||
|
];
|
||||||
|
|
||||||
|
// 插入数据
|
||||||
|
$csql = new \ciy\sql('lab_user');
|
||||||
|
$insertId = $db->insert($csql, $data);
|
||||||
|
if ($insertId === false) {
|
||||||
|
return self::err('新增失败:' . $db->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode([
|
||||||
|
'code' => 1,
|
||||||
|
'msg' => '新增成功',
|
||||||
|
'id' => $insertId
|
||||||
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 编辑成员(适配当前 db.php)
|
||||||
|
public static function json_edit() {
|
||||||
|
global $db;
|
||||||
|
$post = new \ciy\post();
|
||||||
|
|
||||||
|
$id = $post->getint('id');
|
||||||
|
$name = trim($post->get('name', ''));
|
||||||
|
$usertitle = $post->getint('usertitle', 10);
|
||||||
|
$stpstatus = $post->getint('stpstatus', 30);
|
||||||
|
$sex = $post->getint('sex', 90);
|
||||||
|
$education = $post->getint('education', 50);
|
||||||
|
$email = trim($post->get('email', ''));
|
||||||
|
|
||||||
|
// 参数验证
|
||||||
|
if (empty($id)) return self::err('参数错误:缺少成员ID');
|
||||||
|
if (empty($name)) return self::err('请输入姓名');
|
||||||
|
|
||||||
|
// 组装更新数据
|
||||||
|
$data = [
|
||||||
|
'name' => $name,
|
||||||
|
'usertitle' => $usertitle,
|
||||||
|
'stpstatus' => $stpstatus,
|
||||||
|
'sex' => $sex,
|
||||||
|
'education' => $education,
|
||||||
|
'email' => $email,
|
||||||
|
'updatetime' => self::tostamp()
|
||||||
|
];
|
||||||
|
|
||||||
|
// 更新数据
|
||||||
|
$csql = new \ciy\sql('lab_user');
|
||||||
|
$csql->where('id', $id);
|
||||||
|
$result = $db->update($csql, $data);
|
||||||
|
if ($result === false) {
|
||||||
|
return self::err('修改失败:' . $db->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode([
|
||||||
|
'code' => 1,
|
||||||
|
'msg' => '修改成功'
|
||||||
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 获取成员详情(适配当前 db.php)
|
||||||
|
public static function json_detail() {
|
||||||
|
global $db;
|
||||||
|
$post = new \ciy\post();
|
||||||
|
$id = $post->getint('id');
|
||||||
|
|
||||||
|
if (empty($id)) return self::err('参数错误:缺少成员ID');
|
||||||
|
|
||||||
|
// 查询详情(通过 ciy\sql 构造参数指定字段)
|
||||||
|
$csql = new \ciy\sql('lab_user', 'id, name, mobile, usertitle, stpstatus, sex, education, email');
|
||||||
|
$csql->where('id', $id);
|
||||||
|
$item = $db->getone($csql);
|
||||||
|
|
||||||
|
if (!is_array($item)) return self::err('成员不存在或已删除');
|
||||||
|
|
||||||
|
// 格式化返回数据
|
||||||
|
$data = [
|
||||||
|
'id' => intval($item['id']),
|
||||||
|
'name' => $item['name'] ?? '',
|
||||||
|
'mobile' => $item['mobile'] ?? '',
|
||||||
|
'usertitle' => intval($item['usertitle']),
|
||||||
|
'stpstatus' => intval($item['stpstatus']),
|
||||||
|
'sex' => intval($item['sex']),
|
||||||
|
'education' => intval($item['education'] ?? 50),
|
||||||
|
'email' => $item['email'] ?? ''
|
||||||
|
];
|
||||||
|
|
||||||
|
echo json_encode([
|
||||||
|
'code' => 1,
|
||||||
|
'data' => $data
|
||||||
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 删除成员(适配当前 db.php)
|
||||||
|
public static function json_del() {
|
||||||
|
global $db;
|
||||||
|
$post = new \ciy\post();
|
||||||
|
$id = $post->getint('id');
|
||||||
|
|
||||||
|
if (empty($id)) return self::err('参数错误:缺少成员ID');
|
||||||
|
|
||||||
|
// 物理删除
|
||||||
|
$csql = new \ciy\sql('lab_user');
|
||||||
|
$csql->where('id', $id);
|
||||||
|
$result = $db->delete($csql);
|
||||||
|
|
||||||
|
if ($result === false) {
|
||||||
|
return self::err('删除失败:' . $db->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode([
|
||||||
|
'code' => 1,
|
||||||
|
'msg' => '删除成功'
|
||||||
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. 审核成员(适配当前 db.php)
|
||||||
|
public static function json_audit() {
|
||||||
|
global $db;
|
||||||
|
$post = new \ciy\post();
|
||||||
|
$id = $post->getint('id');
|
||||||
|
$status = $post->getint('status');
|
||||||
|
|
||||||
|
if (empty($id)) return self::err('参数错误:缺少成员ID');
|
||||||
|
if (!in_array($status, [10,20,30,40,50])) return self::err('无效的状态值');
|
||||||
|
|
||||||
|
$data = ['stpstatus' => $status];
|
||||||
|
$csql = new \ciy\sql('lab_user');
|
||||||
|
$csql->where('id', $id);
|
||||||
|
$result = $db->update($csql, $data);
|
||||||
|
if ($result === false) {
|
||||||
|
return self::err('审核失败:' . $db->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode([
|
||||||
|
'code' => 1,
|
||||||
|
'msg' => '审核成功'
|
||||||
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通用错误返回
|
||||||
|
private static function err($msg) {
|
||||||
|
echo json_encode([
|
||||||
|
'code' => 0,
|
||||||
|
'errmsg' => $msg
|
||||||
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 兼容tostamp函数
|
||||||
|
private static function tostamp() {
|
||||||
|
return isset($GLOBALS['tostamp']) ? $GLOBALS['tostamp']() : time() * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 兼容getip函数
|
||||||
|
private static function getip() {
|
||||||
|
if (isset($_SERVER['HTTP_X_REAL_IP'])) {
|
||||||
|
return $_SERVER['HTTP_X_REAL_IP'];
|
||||||
|
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
|
||||||
|
return $_SERVER['HTTP_X_FORWARDED_FOR'];
|
||||||
|
} else {
|
||||||
|
return $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行入口
|
||||||
|
member::index();
|
||||||
|
?>
|
||||||
|
|
@ -0,0 +1,153 @@
|
||||||
|
/*
|
||||||
|
Navicat Premium Data Transfer
|
||||||
|
|
||||||
|
Source Server : ryx
|
||||||
|
Source Server Type : MariaDB
|
||||||
|
Source Server Version : 100510
|
||||||
|
Source Host : localhost:3307
|
||||||
|
Source Schema : c5_labsci
|
||||||
|
|
||||||
|
Target Server Type : MariaDB
|
||||||
|
Target Server Version : 100510
|
||||||
|
File Encoding : 65001
|
||||||
|
|
||||||
|
Date: 26/01/2026 16:22:50
|
||||||
|
*/
|
||||||
|
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for zc_cata
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `zc_cata`;
|
||||||
|
CREATE TABLE `zc_cata` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`upid` int(11) NOT NULL COMMENT '上级,DB,zc_cata',
|
||||||
|
`csort` int(11) NOT NULL DEFAULT 10 COMMENT '排序',
|
||||||
|
`isuse` int(11) NOT NULL DEFAULT 1 COMMENT '|行为|,BOOL',
|
||||||
|
`cbid` int(11) NOT NULL DEFAULT 0 COMMENT '库,DB,zc_cata',
|
||||||
|
`codeid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '值',
|
||||||
|
`name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称',
|
||||||
|
`clas` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '样式类',
|
||||||
|
`extdata` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '扩展值',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
INDEX `cbid`(`cbid`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 12001749 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of zc_cata
|
||||||
|
-- ----------------------------
|
||||||
|
INSERT INTO `zc_cata` VALUES (1, 0, 0, 1, 0, '', '固定字典', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (2, 0, 0, 1, 0, '', '灵活字典', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10, 1, 0, 1, 0, 'sex', '性别', '', 'zc_admin');
|
||||||
|
INSERT INTO `zc_cata` VALUES (11, 1, 0, 1, 0, 'stpstatus', '账号状态', '', 'zc_admin');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12, 1, 0, 1, 0, 'auditstatus', '审核状态', '', 'zc_urole');
|
||||||
|
INSERT INTO `zc_cata` VALUES (13, 1, 0, 1, 0, 'autotaskstatus', '任务状态', '', 'zc_autotask');
|
||||||
|
INSERT INTO `zc_cata` VALUES (14, 2, 0, 1, 0, 'targettype', '子系统', '', 'zc_debug_user\nzc_online');
|
||||||
|
INSERT INTO `zc_cata` VALUES (18, 1, 0, 1, 0, 'cashstatus', '提现状态', '', 'ap_cash_out');
|
||||||
|
INSERT INTO `zc_cata` VALUES (19, 2, 0, 1, 0, 'cashtype', '收支分类', '', 'ap_cash_ie,ap_cash_oe');
|
||||||
|
INSERT INTO `zc_cata` VALUES (21, 2, 0, 1, 0, 'userlevel', '用户等级', '', 'ap_user');
|
||||||
|
INSERT INTO `zc_cata` VALUES (22, 1, 0, 1, 0, 'artsort', '文章排序', '', 'ap_art_post');
|
||||||
|
INSERT INTO `zc_cata` VALUES (23, 1, 0, 1, 0, 'artstatus', '文章状态', '', 'ap_art_post');
|
||||||
|
INSERT INTO `zc_cata` VALUES (24, 2, 0, 1, 0, 'certs', '认证范围', '', 'ap_user');
|
||||||
|
INSERT INTO `zc_cata` VALUES (100, 2, 0, 1, 0, 'aicapacity', 'AI能力', '', 'zc_ai_key');
|
||||||
|
INSERT INTO `zc_cata` VALUES (101, 1, 0, 1, 0, 'aidotype', 'AI执行方式', '', 'zc_ai_tsk_run');
|
||||||
|
INSERT INTO `zc_cata` VALUES (102, 1, 10, 1, 0, 'education', '学历', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (103, 0, 10, 1, 0, 'orderstatus', '订单状态', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1000, 0, 10, 1, 10, '10', '男', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1001, 0, 20, 1, 10, '20', '女', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1002, 0, 90, 1, 10, '90', '其他', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1010, 0, 8, 1, 11, '8', '被禁用', 'dag', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1011, 0, 9, 1, 11, '9', '登录保护', 'warn', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1012, 0, 10, 1, 11, '10', '正常', 'succ', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1020, 0, 10, 2, 12, '10', '草稿', 'def', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1021, 0, 20, 1, 12, '20', '未审核', 'man', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1022, 0, 50, 1, 12, '50', '审核中', 'warn', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1023, 0, 90, 1, 12, '90', '驳回', 'dag', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1024, 0, 95, 1, 12, '95', '撤回', 'def', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1025, 0, 100, 1, 12, '100', '通过', 'succ', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1030, 0, 20, 1, 13, '20', '等待执行', 'succ', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1031, 0, 30, 1, 13, '30', '执行中', 'warn', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1039, 0, 90, 1, 13, '90', '禁止执行', 'dag', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1040, 0, 10, 1, 14, '10', '总控', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1041, 0, 20, 1, 14, '20', 'SaaS PC端', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1042, 0, 21, 1, 14, '21', 'SaaS 移动端', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1150, 0, 10, 1, 18, '10', '申请中', 'def', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1151, 0, 20, 1, 18, '20', '已通过', 'warn', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1152, 0, 21, 2, 18, '21', '微信操作中', 'warn', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1153, 0, 30, 1, 18, '30', '已传发票', 'man', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1154, 0, 50, 1, 18, '50', '待打款', 'def', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1155, 0, 90, 1, 18, '90', '已拒绝', 'dag', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1156, 0, 100, 1, 18, '100', '已完成', 'succ', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1200, 0, 10, 1, 19, '10', '充值', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1201, 0, 11, 1, 19, '11', '提现', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1210, 0, 20, 1, 19, '20', '推荐奖', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1211, 0, 21, 1, 19, '21', '带新奖', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1212, 0, 22, 1, 19, '22', '领导奖', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1550, 0, 1, 1, 21, '10', 'LV.1', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1551, 0, 2, 1, 21, '20', 'LV.2', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1600, 0, 0, 1, 22, '10', '劣后', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1601, 0, 0, 1, 22, '20', '正常', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1602, 0, 0, 1, 22, '30', '置顶', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1603, 0, 0, 1, 22, '40', '总置顶', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1650, 0, 0, 1, 23, '10', '草稿', 'def', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1651, 0, 0, 1, 23, '20', '待审核', 'warn', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1652, 0, 0, 1, 23, '90', '驳回', 'dag', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1653, 0, 0, 1, 23, '100', '发布', 'succ', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1700, 0, 10, 1, 24, 'a', '实名认证', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (1701, 0, 20, 1, 24, 'b', '付费会员', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10100, 0, 1, 1, 100, 'text', '文本', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10101, 0, 2, 1, 100, 'json', 'JSON', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10105, 0, 5, 1, 100, 'fcall', '函数', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10110, 0, 10, 1, 100, 'image', '理解图像', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10115, 0, 15, 1, 100, 'video', '理解视频', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10120, 0, 20, 1, 100, '3dmodel', '理解三维', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10150, 0, 0, 1, 101, '10', '等待介入', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10151, 0, 0, 1, 101, '30', '专家研判', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10152, 0, 0, 1, 101, '20', '专家建议', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10154, 0, 0, 1, 101, '100', 'AI不执行', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10155, 0, 0, 1, 101, '110', 'AI自主执行', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10156, 0, 0, 1, 101, '150', '直接执行', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10157, 0, 0, 1, 101, '160', '改后执行', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10159, 0, 0, 1, 101, '190', '人类拒绝', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10160, 0, 0, 1, 101, '200', 'AI执行已阅', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10161, 0, 0, 1, 101, '210', 'AI执行问题', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10200, 0, 10, 1, 102, '10', '小学', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10201, 0, 10, 1, 102, '20', '初中', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10202, 0, 10, 1, 102, '30', '高中', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10203, 0, 10, 1, 102, '40', '大专', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10204, 0, 10, 1, 102, '50', '本科', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10205, 0, 10, 1, 102, '60', '硕士', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10206, 0, 10, 1, 102, '70', '博士', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10250, 0, 10, 1, 103, '10', '等待指令', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10251, 0, 10, 1, 103, '20', '队列中', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10252, 0, 10, 1, 103, '30', '转账中', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10253, 0, 10, 1, 103, '100', '成功', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (10254, 0, 10, 1, 103, '90', '失败', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001701, 2, 10, 1, 0, 'usertitle', '实验室成员头衔', '', 'lab_user.usertitle');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001702, 2, 20, 1, 0, 'sex', '成员性别', '', 'lab_user.sex');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001703, 2, 30, 1, 0, 'stpstatus', '实验室成员状态', '', 'lab_user.stpstatus');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001704, 2, 40, 1, 0, 'userlevel', '实验室成员等级', '', 'lab_user.userlevel');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001724, 0, 10, 1, 12001702, '10', '未知', 'weizhi', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001725, 0, 20, 1, 12001702, '20', '男', 'man', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001726, 0, 30, 1, 12001702, '30', '女', 'woman', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001729, 0, 10, 1, 12001703, '10', '负责人', 'man', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001730, 0, 20, 1, 12001703, '20', '科研秘书', 'man', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001731, 0, 30, 1, 12001703, '30', '在册成员', 'succ', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001732, 0, 40, 1, 12001703, '40', '历史成员', 'def', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001733, 0, 50, 1, 12001703, '50', '外部成员', 'warn', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001734, 0, 10, 1, 12001701, '10', '主任', 'man', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001735, 0, 20, 1, 12001701, '20', '副主任', 'man', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001736, 0, 30, 1, 12001701, '30', '顾问', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001737, 0, 40, 1, 12001701, '40', '名誉主任', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001738, 0, 50, 1, 12001701, '50', '教授', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001739, 0, 60, 1, 12001701, '60', '副教授', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001740, 0, 70, 1, 12001701, '70', '讲师', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001741, 0, 80, 1, 12001701, '80', '研究员', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001745, 0, 10, 1, 12001704, '10', '普通成员', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001746, 0, 20, 1, 12001704, '20', '核心成员', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001747, 0, 30, 1, 12001704, '30', '管理员', '', '');
|
||||||
|
INSERT INTO `zc_cata` VALUES (12001748, 0, 10, 1, 102, '0', '未知', '', '');
|
||||||
|
|
||||||
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
Loading…
Reference in New Issue
Block a user