在研课题和成员管理已完成

This commit is contained in:
ryx 2026-03-18 00:12:48 +08:00
parent f38cd2871c
commit 5c01431c7d
27 changed files with 2711 additions and 9185 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -128,6 +128,7 @@
._vli {
overflow-x: scroll;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
background: var(--bg1);
border-bottom: 1px solid var(--bg6);
}

View File

@ -414,15 +414,24 @@
{
"root": "pages/lab",
"pages": [
{
"path": "userlist"
},
{
"path":"useradd"
},
{
"path":"list"
}
"path":"user_list"
},
{
"path":"useredit"
},
{
"path":"project_list"
},
{
"path":"project_edit"
},
{
"path":"project_add"
}
]
}
]

View File

@ -70,6 +70,7 @@
<ciy-upload imgwidth="600" imgheight="600" path="demo" name="avar" v-model="editdata.avar"></ciy-upload>
</view>
</view>
{{editdata}}
<view class="ciy-form">
<label>是否使用</label>
<view>
@ -91,9 +92,10 @@
<view class="ciy-form">
<label>单选状态</label>
<view>
<ciy-radio left :range="g.auditstatus" name="sigstatus" v-model="editdata.sigstatus"></ciy-radio>
<ciy-radio left :range="g.usertitle" name="sigstatus" v-model="editdata.sigstatus"></ciy-radio>
</view>
</view>
{{g.auditstatus}}
<view class="ciy-form">
<label>多选状态</label>
<view>
@ -106,6 +108,7 @@
<ciy-selcas :range="g.zc_depart" name="prodcata" v-model="editdata.prodcata"></ciy-selcas>
</view>
</view>
{{g.zc_depart}}
<view class="ciy-form">
<label>所在地区</label>
<view>

View File

@ -1,331 +0,0 @@
<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,323 @@
<template>
<view class="ciy-page">
<view class="ciy-title mk bg2">
<view class="title">新增在研课题</view>
<button class="btn def sm" @click="goBack">返回</button>
</view>
<view class="main bg4 flex1 overflow-auto px4 py3">
<form class="ciy-form-group">
<!-- 课题标题 -->
<view class="ciy-form">
<label class="imp">课题标题</label>
<view>
<ciy-input name="name" v-model="form.name" placeholder="请输入课题标题" required></ciy-input>
</view>
</view>
<!-- 备案编号 -->
<view class="ciy-form">
<label>备案编号</label>
<view>
<ciy-input name="recordno" v-model="form.recordno" placeholder="请输入备案编号"></ciy-input>
</view>
</view>
<!-- 摘要 -->
<view class="ciy-form">
<label>摘要</label>
<view>
<ciy-input type="textarea" name="descs" v-model="form.descs" placeholder="请输入摘要"></ciy-input>
</view>
</view>
<!-- 预算金额 -->
<view class="ciy-form">
<label>预算金额</label>
<view>
<ciy-inputbet bet="1000000" unit="万元" name="budgetmoney" v-model="form.budgetmoney"></ciy-inputbet>
</view>
</view>
<!-- 服务机构 -->
<view class="ciy-form">
<label>服务机构</label>
<view>
<ciy-input name="serviceorg" v-model="form.serviceorg" placeholder="请输入服务机构"></ciy-input>
</view>
</view>
<!-- 负责人 -->
<view class="ciy-form">
<label>负责人</label>
<view>
<ciy-select :range="page_users" name="principal_id" v-model="form.principal_id"></ciy-select>
</view>
</view>
<!-- 所属机构 -->
<view class="ciy-form">
<label>所属机构</label>
<view>
<ciy-select :range="page_orgs" name="laborgid" v-model="form.laborgid"></ciy-select>
</view>
</view>
<!-- 科研类目 -->
<view class="ciy-form">
<label>科研类目</label>
<view>
<ciy-select :range="g.rcate" name="rcate" v-model="form.rcate"></ciy-select>
</view>
</view>
<!-- 课题状态 -->
<view class="ciy-form">
<label>课题状态</label>
<view>
<ciy-select :range="g.rprojectstatus" name="rprojectstatus" v-model="form.rprojectstatus"></ciy-select>
</view>
</view>
<!-- 是否公开 -->
<view class="ciy-form">
<label>是否公开</label>
<view>
<ciy-radio :range="g.isweb" name="isweb" v-model="form.isweb"></ciy-radio>
</view>
</view>
<!-- 备案方向 -->
<view class="ciy-form">
<label>备案方向</label>
<ciy-selcas
v-model="form.direction"
name="direction"
:range="g.direction"
placeholder="请选择备案方向"
></ciy-selcas>
</view>
<!-- 主管部门 -->
<view class="ciy-form">
<label>主管部门</label>
<view>
<ciy-input name="mdeptname" v-model="form.mdeptname" placeholder="请输入主管部门"></ciy-input>
</view>
</view>
<!-- 层次 -->
<view class="ciy-form">
<label>层次</label>
<view>
<ciy-select :range="g.mdeptlevel" name="mdeptlevel" v-model="form.mdeptlevel"></ciy-select>
</view>
</view>
<view class="ciy-form">
<label>进度</label>
<view>
<ciy-input name="progress" v-model="form.progress"></ciy-input>
</view>
</view>
<!-- 最新进展日期 -->
<view class="ciy-form">
<label>最新进展日期</label>
<view>
<ciy-inputdatetime name="lasttimes" v-model="form.lasttimes"></ciy-inputdatetime>
</view>
</view>
<!-- 备案时间 -->
<view class="ciy-form">
<label>备案时间</label>
<view>
<ciy-inputdatetime name="recordtime" v-model="form.recordtime"></ciy-inputdatetime>
</view>
</view>
<!-- 最新附件 -->
<view class="ciy-form">
<label>最新附件</label>
<view>
<ciy-upload path="demo" name="latestattachment" v-model="form.latestattachment"></ciy-upload>
</view>
</view>
<!-- 项目成员 -->
<view class="ciy-form">
<label>项目成员</label>
<view>
<view v-for="(member, index) in form.members" :key="index" class="member-row">
<ciy-select :range="page_users" v-model="member.uid" placeholder="选择成员"></ciy-select>
<ciy-select :range="g.prole" v-model="member.prole" placeholder="选择角色"></ciy-select>
<button type="button" @click="removeMember(index)">-</button>
</view>
<button type="button" @click="addMember()">+ 添加成员</button>
</view>
</view>
</form>
<view class="ciy-form-bottom mt4">
<button
class="btn man lgg long"
@click="submitForm"
:disabled="isSubmitting"
>
{{ isSubmitting ? '提交中...' : '提交课题' }}
</button>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
isSubmitting: false,
form: {
id: 0,
recordno: '',
laborgid: 0,
isweb: 0,
rcate: 0,
name: '',
descs: '',
mdeptname: '',
mdeptlevel: 0,
budgetmoney: 0,
serviceorg: '',
principal_id: 0,
rprojectstatus: 0,
progress: 0,
lasttimes: 0,
recordtime: 0,
latestcontent: '',
latestattachment: '',
direction: 0,
members: []
},
page_users: [],
page_orgs: [],
};
},
async onLoad() {
await this.loadInitialData();
},
methods: {
goBack() {
uni.navigateBack({ delta: 1 });
},
async loadInitialData(){
const retjson = await this.callfunc({
func: 'project.addinit',
data: { act: 'edit' }
});
console.log('--- project.addinit 返回的数据 ---', retjson);
if (retjson.code === 1) {
const rawUsers = retjson.users || [];
this.page_users = rawUsers.map(user => ({
id: user.id,
name: user.name
}));
const rawOrgs = retjson.orgs || [];
console.log('--- rawOrgs from backend ---', rawOrgs);
this.page_orgs = rawOrgs.map(org => ({
id: org.id,
name: org.name
}));
console.log('--- this.page_orgs after mapping ---', this.page_orgs); //
if (retjson.rcate) this.$set(this.g, 'rcate', retjson.rcate);
if (retjson.rprojectstatus) this.$set(this.g, 'rprojectstatus', retjson.rprojectstatus);
if (retjson.direction) this.$set(this.g, 'direction', retjson.direction);
if (retjson.isweb) this.$set(this.g, 'isweb', retjson.isweb);
if (retjson.mdeptlevel) this.$set(this.g, 'mdeptlevel', retjson.mdeptlevel);
if (retjson.prole) this.$set(this.g, 'prole', retjson.prole);
if (retjson.principal_id) this.$set(this.g, 'principal_id', retjson.principal_id);
} else {
this.toast(retjson.msg || '获取基础数据失败');
}
},
addMember() {
const allRoleIds = Object.keys(this.g.prole);
const firstRoleId = allRoleIds.length > 0 ? allRoleIds[0] : "10";
this.form.members.push({
mid: 0,
uid: 0,
prole: firstRoleId,
isNew: true,
isDeleted: false
});
},
removeMember(index) {
this.form.members.splice(index, 1);
},
async submitForm() {
if (!this.form.name) {
return this.toast('请输入课题标题');
}
if (!this.form.recordno) {
return this.toast('请输入备案编号');
}
this.isSubmitting = true;
try {
const submitData = { ...this.form };
//
if (submitData.lasttimes) submitData.lasttimes = Math.floor(submitData.lasttimes / 1000);
if (submitData.recordtime) submitData.recordtime = Math.floor(submitData.recordtime / 1000);
console.log("准备提交的完整数据:", JSON.stringify(submitData, null, 2));
const retjson = await this.callfunc({
func: 'project.add',
data: submitData
});
if (retjson.err && retjson.err.length) {
const errorMsg = retjson.err[0]?.msg || retjson.err[0]?.type || '网络请求异常';
throw new Error(`请求失败: ${errorMsg}`);
}
if (retjson.code !== 1) {
throw new Error(retjson.msg || '添加课题失败');
}
this.toast('添加课题信息成功');
uni.$emit('project-added');
setTimeout(() => this.goBack(), 1500);
} catch (err) {
this.toast(err.message);
console.error('提交编辑异常:', err);
} finally {
this.isSubmitting = false;
}
}
},
};
</script>
<style scoped>
.ciy-edit {
width: 100%;
height: 2rem;
border: 1px solid var(--bg6);
border-radius: 0.3rem;
}
.text-xs {
font-size: 0.75rem;
}
.text-gray-500 {
color: #9ca3af;
}
.mt1 {
margin-top: 0.25rem;
}
.member-row {
display: flex;
gap: 0.5em;
align-items: center;
margin-bottom: 0.5em;
}
</style>

View File

@ -0,0 +1,344 @@
<template>
<view class="ciy-page">
<view class="ciy-title mk bg2">
<view class="title">编辑在研课题信息</view>
<button class="btn def sm" @click="goBack">返回</button>
</view>
<view class="main bg4 flex1 overflow-auto px4 py3">
<form class="ciy-form-group">
<view class="ciy-form">
<label class="imp">课题标题</label>
<view>
<ciy-input name="name" v-model="form.name" placeholder="请输入课题标题" required></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>备案编号</label>
<view>
<ciy-input name="recordno" v-model="form.recordno" placeholder="请输入备案编号"></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>摘要</label>
<view>
<ciy-input type="textarea" name="descs" v-model="form.descs" placeholder="请输入摘要"></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>预算金额</label>
<view>
<ciy-inputbet bet="1000000" unit="万元" name="budgetmoney" v-model="form.budgetmoney"></ciy-inputbet>
</view>
</view>
<view class="ciy-form">
<label>服务机构</label>
<view>
<ciy-input name="serviceorg" v-model="form.serviceorg" placeholder="请输入服务机构"></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>负责人</label>
<view>
<ciy-select :range="page_users" name="principal_id" v-model="form.principal_id"></ciy-select>
</view>
</view>
<view class="ciy-form">
<label>所属机构</label>
<view>
<ciy-select :range="page_orgs" name="laborgid" v-model="form.laborgid"></ciy-select>
</view>
</view>
<view class="ciy-form">
<label>科研类目</label>
<view>
<ciy-select :range="g.rcate" name="rcate" v-model="form.rcate"></ciy-select>
</view>
</view>
<view class="ciy-form">
<label>课题状态</label>
<view>
<ciy-select :range="g.rprojectstatus" name="rprojectstatus" v-model="form.rprojectstatus"></ciy-select>
</view>
</view>
<view class="ciy-form">
<label>是否公开</label>
<view>
<ciy-radio :range="g.isweb" name="isweb" v-model="form.isweb"></ciy-radio>
</view>
</view>
<view class="ciy-form">
<label>备案方向</label>
<ciy-selcas
v-model="form.direction"
name="direction"
:range="g.direction"
placeholder="请选择备案方向"
></ciy-selcas>
</view>
<view class="ciy-form">
<label>主管部门</label>
<view>
<ciy-input name="mdeptname" v-model="form.mdeptname" placeholder="请输入主管部门"></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>层次</label>
<view>
<ciy-select :range="g.mdeptlevel" name="mdeptlevel" v-model="form.mdeptlevel"></ciy-select>
</view>
</view>
<view class="ciy-form">
<label>进度</label>
<view>
<ciy-input name="progress" v-model="form.progress" placeholder="请输入课题进度"></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>最新进展日期</label>
<view>
<ciy-inputdatetime name="lasttimes" v-model="form.lasttimes"></ciy-inputdatetime>
</view>
</view>
<view class="ciy-form">
<label>备案时间</label>
<view>
<ciy-inputdatetime name="recordtime" v-model="form.recordtime"></ciy-inputdatetime>
</view>
</view>
<view class="ciy-form">
<label>最新附件</label>
<view>
<ciy-upload path="demo" name="latestattachment" v-model="form.latestattachment"></ciy-upload>
</view>
</view>
<view class="ciy-form">
<label>项目成员</label>
<view>
<view v-for="(member, index) in form.members" :key="index" class="member-row">
<ciy-select :range="page_users" v-model="member.uid" placeholder="选择成员"></ciy-select>
<ciy-select :range="g.prole" v-model="member.prole" placeholder="选择角色"></ciy-select>
<button type="button" @click="removeMember(index)">-</button>
</view>
<button type="button" @click="addMember()">+ 添加成员</button>
</view>
</view>
</form>
<view class="ciy-form-bottom mt4">
<button
class="btn man lgg long"
@click="submitForm"
:disabled="isSubmitting"
>
{{ isSubmitting ? '更新中...' : '更新课题信息' }}
</button>
</view>
</view>
</view>
</template>
<script>
export default {
props: {
id: {
type: [String, Number],
default: ''
}
},
data() {
return {
isSubmitting: false,
form: {
id: 0,
recordno: '',
laborgid: 0,
isweb: 0,
rcate: 0,
name: '',
descs: '',
mdeptname: '',
mdeptlevel: 0,
budgetmoney: 0,
serviceorg: '',
principal_id: 0,
rprojectstatus: 0,
progress: 0,
lasttimes: 0,
recordtime: 0,
latestcontent: '',
latestattachment: '',
direction: 0,
members: []
},
page_users: [],
page_orgs: [],
};
},
async onLoad(options) {
if (!options.id || parseInt(options.id) <= 0) {
this.toast('无效的课题ID无法进入编辑页面');
setTimeout(() => this.goBack(), 1500);
return;
}
this.form.id = parseInt(options.id);
await this.loadPageData();
await this.getProjectDetail();
},
methods: {
goBack() {
uni.navigateBack({ delta: 1 });
},
async loadPageData() {
const retjson = await this.callfunc({
func: 'project.addinit',
//data: { act: 'edit' }
data: {}
});
if (retjson.code === 1) {
//const rawUsers = retjson.users || [];
//this.page_users = rawUsers.map(user => ({
//id: user.id,
//name: user.name
//}));
//const rawOrgs = retjson.orgs || [];
//this.page_orgs = rawOrgs.map(org => ({
//id: org.id,
//name: org.name
//}));
}
},
async getProjectDetail() {
try {
console.log('开始获取项目详情...');
const retjson = await this.callfunc({
func: 'project.info',
data: { id: this.form.id,act: 'edit' }
});
console.log('项目详情接口返回的完整数据:', retjson); // <--
console.log('项目详情接口返回的 members 字段:', retjson.members); // <--
console.log('项目详情接口返回的 data 字段:', retjson.data); // <-- data
if (retjson.code !== 1) {
throw new Error(retjson.msg || '获取项目信息失败');
}
if (!retjson.data || typeof retjson.data !== 'object') {
throw new Error('项目信息格式异常,请重试');
}
const detail = retjson.data;
this.form = {
...this.form,
...detail,
lasttimes: detail.lasttimes ? detail.lasttimes * 1000 : 0,
recordtime: detail.recordtime ? detail.recordtime * 1000 : 0,
members: (retjson.members || []).map(m => ({
mid: m.id,
uid: m.uid,
prole: m.prole,
isNew: false,
isDeleted: false
}))
};
this.page_users = (retjson.users || []).map(u => ({ id: u.id, name: u.name }));
this.page_orgs = (retjson.orgs || []).map(o => ({ id: o.id, name: o.name }));
} catch (err) {
this.toast(err.message);
console.error('拉取详情异常:', err);
}
},
addMember() {
const allRoleIds = Object.keys(this.g.prole);
const firstRoleId = allRoleIds.length > 0 ? allRoleIds[0] : "10";
this.form.members.push({
mid: 0,
uid: 0,
prole: firstRoleId,
isNew: true,
isDeleted: false
});
},
removeMember(index) {
const member = this.form.members[index];
if (member.mid) {
member.isDeleted = true;
} else {
this.form.members.splice(index, 1);
}
},
async submitForm() {
if (!this.form.name) {
return this.toast('请输入课题标题');
}
if (!this.form.recordno) {
return this.toast('请输入备案编号');
}
this.isSubmitting = true;
try {
const submitData = { ...this.form };
//
if (submitData.lasttimes) submitData.lasttimes = Math.floor(submitData.lasttimes / 1000);
if (submitData.recordtime) submitData.recordtime = Math.floor(submitData.recordtime / 1000);
console.log("准备提交的完整数据:", JSON.stringify(submitData, null, 2));
const retjson = await this.callfunc({
func: 'project.update',
data: submitData
});
if (retjson.err && retjson.err.length) {
const errorMsg = retjson.err[0]?.msg || retjson.err[0]?.type || '网络请求异常';
throw new Error(`请求失败: ${errorMsg}`);
}
if (retjson.code !== 1) {
throw new Error(retjson.msg || '更新课题失败');
}
this.toast('更新课题信息成功');
uni.$emit('project-updated', { id: this.form.id });
setTimeout(() => this.goBack(), 1500);
} catch (err) {
this.toast(err.message);
console.error('提交编辑异常:', err);
} finally {
this.isSubmitting = false;
}
}
},
};
</script>
<style scoped>
.ciy-edit {
width: 100%;
height: 2rem;
border: 1px solid var(--bg6);
border-radius: 0.3rem;
}
.text-xs {
font-size: 0.75rem;
}
.text-gray-500 {
color: #9ca3af;
}
.mt1 {
margin-top: 0.25rem;
}
.member-row {
display: flex;
gap: 0.5em;
align-items: center;
margin-bottom: 0.5em;
}
</style>

View File

@ -0,0 +1,255 @@
<template>
<ciy-header title="在研课题备案管理" ref="header"></ciy-header>
<view class="ciy-page">
<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: headerTotalHeight + '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="project-item">
<view class="project-header">
<text class="title">{{ item.name }}</text>
<text class="record-no">备案编号: {{ item.recordno }}</text>
</view>
<view class="project-details">
<text class="summary">{{ item.descs }}</text>
<text class="org-name">所属机构: {{ item.orgname }}</text>
<text class="status">状态: <text :class="ccode(g.rprojectstatus, item.rprojectstatus,'clas')">{{ ccode(g.rprojectstatus, item.rprojectstatus) }}</text></text>
<text class="progress">进度: {{ item.progress }}%</text>
<text class="progress">负责人: {{ item.principal_name}}</text>
<text class="members">成员: {{ item.member_names || '暂无成员' }}</text>
</view>
</view>
</view>
<ciy-listend :page="pageno" :listlen="init.list.length" :nodataimg="file_stor('/img/mbnone.png')"></ciy-listend>
<view class="ciy-add" @tap="goAdd()"></view>
</view>
</view>
</template>
<script>
export default {
data() {
return {};
},
computed: {
headerTotalHeight() {
return this.header_statusbar_height + this.header_title_height;
}
},
onLoad() {
this.$nextTick(() => {
this.getrefs('header').then(ref => {
this.header_statusbar_height = ref.statusbar_height;
this.header_title_height = ref.title_height;
});
});
this.getlist();
uni.$off('project-updated'); //
uni.$off('project-added');
uni.$on('project-updated', (params) => {
console.log('收到课题更新通知,正在刷新列表...', params);
//
this.pageno = 0;
this.getlist();
});
uni.$on('project-added', () => { //
console.log('收到课题新增通知,正在刷新列表...');
this.pageno = 0; //
this.getlist();
});
},
onUnload() {
// --- ---
uni.$off('project-updated');
uni.$off('project-added');
},
onReachBottom() {
console.log('onReachBottom page', this.pageno);
if (this.init.code != 1) return;
this.getlist();
},
onPullDownRefresh() {
console.log('onPullDownRefresh page');
this.pageno = 0;
this._stopPullDown = true;
this.getlist();
},
methods: {
async getlist() {
if (this.pageno < 0 || this._loading) return;
this.pagepost.pageno = this.pageno + 1;
this.pagepost.once = !this.init.once;
this._loading = true;
try {
var retjson = await this.callfunc({
func: 'project.list',
data: this.pagepost
});
if (retjson.code != 1) {
this.alert(retjson.errmsg);
return;
}
this.pageno++;
if (this.pageno == 1) this.init.list = [];
this.init = this.objdeepmerge(this.init, retjson);
console.log(this)
if (retjson.once) {
if (retjson.lis) {
this.init.lis = retjson.lis;
}
}
//
this.getrefs('query').then(ref => {
ref.setdata(retjson.searchwhere?.query || {});
});
//
if (retjson.list && retjson.list.length < this.pagepost.pagecount) {
this.pageno = -1;
}
} catch (error) {
console.error('获取列表失败:', error);
this.alert('获取列表失败');
} finally {
this._loading = false;
uni.stopPullDownRefresh();
}
},
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 });
},
edit(item) {
item = item || { data: { id: 0, _idx: -1 } };
uni.navigateTo({
url: `/pages/lab/project_edit?id=${item.data.id}`
});
},
goAdd() {
uni.navigateTo({
url: '/pages/lab/project_add'
});
},
async del(item) {
if (await this.askmsg('是否确定删除该在研课题?', '确认删除') != 'ok') return;
var retjson = await this.callfunc({
func: 'project.del',
data: { id: item.data.id }
});
if (retjson.code != 1) {
this.alert(retjson.errmsg);
return;
}
this.init.list[item.data._idx]._del = true;
setTimeout(() => {
this.init.list.splice(item.data._idx, 1);
}, 500);
},
showmenu(idx) {
var dat = this.init.list[idx];
dat._idx = idx;
var items = [];
items.push({ func: 'edit', name: '编辑', data: dat });
items.push({ func: 'del', name: '删除', style: 'color:var(--dag5)', data: dat });
this.popmenu({ items });
}
}
};
</script>
<style scoped>
.sti {
position: sticky;
z-index: 10;
background: var(--bg1);
padding: 0.5rem;
border-bottom: 1px solid var(--bg6);
}
.project-item {
padding: 1rem;
margin: 0.5rem;
border: 1px solid var(--bg6);
border-radius: 8px;
background-color: var(--bg2);
}
.project-header {
display: flex;
justify-content: space-between;
align-items: baseline;
margin-bottom: 0.5rem;
}
.title {
font-size: 1.1em;
font-weight: bold;
color: var(--text1);
}
.record-no {
font-size: 0.8em;
color: var(--text3);
}
.project-details {
display: flex;
flex-direction: column;
gap: 0.3rem;
}
.summary {
font-size: 0.9em;
color: var(--text2);
line-height: 1.3;
}
.org-name, .status, .progress {
font-size: 0.85em;
color: var(--text3);
}
.members {
font-size: 0.85em;
color: var(--text3);
word-break: break-all;
}
</style>

View File

@ -0,0 +1,254 @@
<template>
<ciy-header title="实验室成员管理" ref="header"></ciy-header>
<view class="ciy-page">
<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: headerTotalHeight + '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="member-item flex align-center">
<ciy-svgimg :src="item.icon" ciystyle="border-radius:50%;width:3.5em;height:3.5em;margin-right:1em;"></ciy-svgimg>
<view class="member-info">
<view class="l0">No: {{item.id}}</view>
<view class="rt">
<view class="code b" :class="ccode(g.role, item.role,'clas')">{{ccode(g.role, item.role)}}</view>
</view>
<view class="l1 c">
<view>{{item.name}}</view>
</view>
<view class="ciy-hr"></view>
<view class="l2">编号{{item.sn}}</view>
<view class="l2">手机号{{item.mobile || '未填写'}}</view>
<view class="l2">头衔{{ccode(g.usertitle, item.usertitle)}}</view>
</view>
</view>
</view>
<ciy-listend :page="pageno" :listlen="init.list.length" :nodataimg="file_stor('/img/mbnone.png')"></ciy-listend>
<view class="ciy-add" @tap="goAdd()"></view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
init: {
code: 0,
list: [],
lis: []
},
pageno: 0,
_loading: false,
_stopPullDown: false,
header_statusbar_height: 0,
header_title_height: 0,
pagepost: {
pageno: 0,
once: true,
query: {},
liid: 0
}
};
},
computed: {
headerTotalHeight() {
return this.header_statusbar_height + this.header_title_height;
}
},
onLoad() {
this.$nextTick(() => {
this.getrefs('header').then(ref => {
this.header_statusbar_height = ref.statusbar_height;
this.header_title_height = ref.title_height;
});
});
this.getlist();
},
onReachBottom() {
console.log('onReachBottom page', this.pageno);
if (this.init.code != 1)
return;
this.getlist();
},
onPullDownRefresh() {
console.log('onPullDownRefresh page');
this.pageno = 0;
this._stopPullDown = true;
this.getlist();
},
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;
try {
var retjson = await this.callfunc({
func: 'adduser.list',
data: this.pagepost
});
if (retjson.code != 1) {
this.alert(retjson.errmsg);
return;
}
this.pageno++;
if (this.pageno == 1)
this.init.list = [];
this.init = this.objdeepmerge(this.init, retjson);
if (retjson.once) {
if (retjson.lis) {
this.init.lis = retjson.lis;
}
}
this.getrefs('query').then(ref => {
ref.setdata(retjson.where || {});
});
if (retjson.list && retjson.list.length < 10)
this.pageno = -1;
} catch (error) {
console.error('获取列表失败:', error);
this.alert('获取列表失败');
} finally {
this._loading = false;
uni.stopPullDownRefresh();
}
},
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
});
},
edit(item) {
item = item || {
url: '',
data: {
id: 0,
_idx: -1
}
};
uni.navigateTo({
url: `/pages/lab/useredit?id=${item.data.id}`
});
},
goAdd() {
uni.navigateTo({
url: '/pages/lab/useradd'
});
},
async del(item) {
if (await this.askmsg('是否确定删除该成员?', '确认删除') != 'ok')
return;
var retjson = await this.callfunc({
func: 'adduser.del',
data: {
id: item.data.id
}
});
if (retjson.code != 1) {
this.alert(retjson.errmsg);
return;
}
this.init.list[item.data._idx]._del = true;
setTimeout(() => {
this.init.list.splice(item.data._idx, 1);
}, 500);
},
showmenu(idx) {
var dat = this.init.list[idx];
dat._idx = idx;
var items = [];
items.push({
func: 'edit',
name: '编辑',
data: dat
});
items.push({
func: 'del',
name: '删除',
style: 'color:var(--dag5)',
data: dat
});
this.popmenu({
items
});
}
}
};
</script>
<style scoped>
.sti {
position: sticky;
z-index: 10;
background: var(--bg1);
padding: 0.5rem;
border-bottom: 1px solid var(--bg6);
}
.member-item {
padding: 0.5rem;
display: flex;
align-items: center;
}
.member-info {
flex: 1;
}
</style>

View File

@ -6,125 +6,74 @@
</view>
<view class="main bg4 flex1 overflow-auto px4 py3">
<form class="ciy-form-group">
<view class="ciy-form">
<label class="imp">成员姓名</label>
<view>
<ciy-input name="name" v-model="form.name" placeholder="请输入成员姓名" required></ciy-input>
</view>
</view>
<view class="ciy-form">
<label class="imp char4">姓名</label>
<input
type="text"
v-model="form.name"
placeholder="请输入成员姓名"
class="ciy-edit px2 py1 bg1 rounded"
required
/>
</view>
<view class="ciy-form">
<label class="char4">头像</label>
<view class="flex flex-center">
<image
:src="form.icon || '/lab/lab.png'"
mode="aspectFill"
class="w-12 h-12 rounded-full mr3"
></image>
<button class="btn def sm" @click="chooseAvatar">选择图片</button>
</view>
</view>
<view class="ciy-form">
<label class="char4">头衔</label>
<picker
mode="selector"
:range="titleOptions"
:range-key="'label'"
class="px2 py1 bg1 rounded w-full"
@change="handlePickerChange($event, 'usertitle')"
>
<view class="txt-left px2 py1">{{getPickerCurrentLabel('usertitle') }}</view>
</picker>
</view>
<view class="ciy-form">
<label class="imp char4">状态</label>
<picker
mode="selector"
:range="statusOptions"
:range-key="'label'"
class="px2 py1 bg1 rounded w-full"
@change="handlePickerChange($event, 'role')"
required
>
<view class="txt-left px2 py1">{{ getPickerCurrentLabel('role') }}</view>
</picker>
</view>
<view class="ciy-form">
<label class="char4">学历</label>
<picker
mode="selector"
:range="educationOptions"
:range-key="'label'"
class="px2 py1 bg1 rounded w-full"
@change="handlePickerChange($event, 'education')"
>
<view class="txt-left px2 py1">{{ getPickerCurrentLabel('education') }}</view>
</picker>
</view>
<view class="ciy-form">
<label class="char4">编号</label>
<input
type="text"
v-model="form.sn"
placeholder="如 LAB-2024-001"
class="ciy-edit px2 py1 bg1 rounded"
/>
</view>
<view class="ciy-form">
<label class="char4">性别</label>
<picker
mode="selector"
:range="sexOptions"
:range-key="'label'"
class="px2 py1 bg1 rounded w-full"
@change="handlePickerChange($event, 'sex')"
>
<view class="txt-left px2 py1">{{ getPickerCurrentLabel('sex') }}</view>
</picker>
</view>
<view class="ciy-form">
<label class="char4">加入日期</label>
<picker
mode="date"
v-model="form.addtimesText"
start="2000-01-01"
end="2100-12-31"
class="px2 py1 bg1 rounded w-full"
@change="handleDateChange"
>
<view class="txt-left px2 py1">{{ form.addtimesText || '请选择日期' }}</view>
</picker>
</view>
<view class="ciy-form">
<label class="char4">手机号</label>
<input
type="number"
v-model="form.mobile"
placeholder="请输入11位手机号"
class="ciy-edit px2 py1 bg1 rounded"
maxlength="11"
/>
</view>
<view class="ciy-form">
<label class="char4">邮箱</label>
<input
type="email"
v-model="form.email"
placeholder="请输入邮箱地址"
class="ciy-edit px2 py1 bg1 rounded"
/>
<label>头像</label>
<view>
<ciy-upload imgwidth="600" imgheight="600" path="demo" name="avar" v-model="form.icon"></ciy-upload>
</view>
</view>
<view class="ciy-form">
<label>头衔</label>
<view>
<ciy-select :range="g.usertitle" name="menuid" v-model="form.usertitle"></ciy-select>
</view>
</view>
<view class="ciy-form">
<label>状态</label>
<view>
<ciy-radio left :range="g.role" name="sigstatus" v-model="form.role"></ciy-radio>
</view>
</view>
<view class="ciy-form">
<label>学历</label>
<view>
<ciy-select :range="g.education" name="menuid" v-model="form.education"></ciy-select>
</view>
</view>
<view class="ciy-form">
<label class="imp">编号</label>
<view>
<ciy-input name="name" v-model="form.sn" placeholder="请输入成员编号" required></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>性别</label>
<view>
<ciy-radio left :range="g.sex" name="sex" v-model="form.sex"></ciy-radio>
</view>
</view>
<view class="ciy-form">
<label>加入日期</label>
<view>
<ciy-inputdatetime name="date" v-model="form.addtimes"></ciy-inputdatetime>
</view>
</view>
<view class="ciy-form">
<label>手机号</label>
<view>
<ciy-input name="mobile" v-model="form.mobile" placeholder="请输入11位手机号" required></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>邮箱</label>
<view>
<ciy-input name="email" v-model="form.email" placeholder="请输入邮箱地址" required></ciy-input>
</view>
</view>
<view class="ciy-form">
<label class="char4">初始密码</label>
<input
type="password"
v-model="form.password"
v-model="form.pass"
placeholder="默认1"
class="ciy-edit px2 py1 bg1 rounded"
:value="form.password || '1'"
:value="form.pass || '1'"
/>
</view>
</form>
@ -140,17 +89,17 @@
</view>
</view>
</template>
<script>
import md5 from '@/util/md5.js';
export default {
data() {
return {
isSubmitting: false,
form: {
laborgid: 0,
stpstatus: 10,
userlevel:10,
dvotecnt:0,
laborgid: 0,
stpstatus: 10,
userlevel:10,
dvotecnt:0,
name: '',
icon: '',
usertitle: 0,
@ -162,129 +111,76 @@ export default {
addtimes: 0,
mobile: '',
email: '',
password: '1'
pass: '1'
},
titleOptions: [
{ value: 0, label: '无头衔' },
{ value: 10, label: '主任' },
{ value: 20, label: '副主任' },
{ value: 30, label: '顾问' },
{ value: 40, label: '名誉主任' },
{ value: 50, label: '教授' },
{ value: 60, label: '副教授' },
{ value: 70, label: '讲师' },
{ value: 80, label: '研究员' }
],
statusOptions: [
{ value: 10, label: '负责人' },
{ value: 20, label: '科研秘书' },
{ value: 30, label: '在册成员' },
{ value: 40, label: '历史成员' },
{ value: 50, label: '外部成员' }
],
educationOptions: [
{ value: 50, label: '本科' },
{ value: 60, label: '硕士' },
{ value: 70, label: '博士' }
],
sexOptions: [
{ value: 10, label: '男' },
{ value: 20, label: '女' },
{ value: 90, label: '其他' }
],
statusMap: { 10: '负责人', 20: '科研秘书', 30: '在册成员', 40: '历史成员', 50: '外部成员' },
educationMap: { 50: '本科', 60: '硕士', 70: '博士' },
sexMap: { 10: '男', 20: '女', 90: '其他' },
titleMap: { 0: '无头衔', 10: '主任', 20: '副主任', 30: '顾问', 40: '名誉主任', 50: '教授', 60: '副教授', 70: '讲师', 80: '研究员' }
};
},
methods: {
goBack() {
uni.navigateBack({ delta: 1 });
},
chooseAvatar() {
uni.chooseImage({
count: 1,
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
const tempFilePath = res.tempFilePaths[0];
this.form.icon = tempFilePath;
}
});
},
handlePickerChange(e, type) {
const selectedIndex = Number(e.detail.value);
const optionMap = {
usertitle: this.titleOptions,
role: this.statusOptions,
education: this.educationOptions,
sex: this.sexOptions
};
const optionList = optionMap[type];
if (!optionList || !optionList[selectedIndex]) return;
this.form[type] = optionList[selectedIndex].value;
},
getPickerCurrentLabel(type) {
const optionMap = {
usertitle: this.titleOptions,
role: this.statusOptions,
education: this.educationOptions,
sex: this.sexOptions
};
const optionList = optionMap[type];
const currentValue = this.form[type];
if (!optionList) return '请选择';
// 3.
const currentOption = optionList.find(item => item.value === currentValue);
// 4.
return currentOption ? currentOption.label : '请选择';
},
handleDateChange(e) {
const selectedDate = e.detail.value;
this.form.addtimesText = selectedDate;
this.form.addtimes = new Date(selectedDate).getTime();
},
async submitForm() {
if (!this.form.name) {
return uni.showToast({ title: '请输入成员姓名', icon: 'none' });
return this.toast('请输入成员姓名');
}
if (!this.form.addtimes) {
return uni.showToast({ title: '请选择加入日期', icon: 'none' });
return this.toast('请选择加入日期');
}
if (this.form.mobile && !/^1[3-9]\d{9}$/.test(this.form.mobile)) {
return uni.showToast({ title: '请输入有效的11位手机号', icon: 'none' });
return this.toast('请输入有效的11位手机号');
}
if (this.form.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this.form.email)) {
return uni.showToast({ title: '请输入有效的邮箱地址', icon: 'none' });
return this.toast('请输入有效的邮箱地址');
}
const postData = this.form;
try {
var retjson = await this.callfunc({
this.form.pass = this.form.pass || '1';
this.isSubmitting=true;
try{
const app=getApp();
const postData={...this.form}
postData.auth = (new Date()).getTime();
postData.pass = md5.md5(postData.pass + app.globalData.tokensalt);
const retjson = await this.callfunc({
func: 'adduser.add',
data: postData
});
});
if (retjson.code !== 1) {
return uni.showToast({ title: retjson.msg || '新增成员失败', icon: 'none' });
return this.toast(retjson.msg || '新增成员失败');
}
uni.showToast({ title: '新增成员成功', icon: 'success' });
this.toast('新增成员成功');
setTimeout(() => {
this.goBack();
}, 1500);
console.log('提交的成员信息:', this.form);
} catch (err) {
uni.showToast({ title: '提交失败,请重试', icon: 'none' });
console.error('新增成员失败:', err);
console.log('提交的成员信息(加密后):', postData);
}catch(err){
this.toast('提交失败:' + err.message);
console.error('提交异常:', err);
}finally{
this.isSubmitting = false;
}
}
},
async saveUser() {
try {
//
const ret = await this.callfunc({ func: 'adduser.edit', data: xxx });
if (ret.code === 1) {
this.toast('编辑成功');
//
const pages = getCurrentPages(); //
const listPage = pages[pages.length - 2]; //
if (listPage && listPage.methods.getList) {
listPage.methods.getList(); // getList
}
uni.navigateBack({ delta: 1 });
}
} catch (err) {
//
}
}
};
</script>
<style scoped>
/* 补充样式:适配表单布局 */
.ciy-edit {
width: 100%;
height: 2rem;

View File

@ -0,0 +1,225 @@
<template>
<view class="ciy-page">
<view class="ciy-title mk bg2">
<view class="title">编辑实验室成员信息</view>
<button class="btn def sm" @click="goBack">返回</button>
</view>
<view class="main bg4 flex1 overflow-auto px4 py3">
<form class="ciy-form-group">
<view class="ciy-form">
<label class="imp">成员姓名</label>
<view>
<ciy-input name="name" v-model="form.name" placeholder="请输入成员姓名" required></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>头像</label>
<view>
<ciy-upload imgwidth="600" imgheight="600" path="demo" name="avar" v-model="form.icon"></ciy-upload>
</view>
</view>
<view class="ciy-form">
<label>头衔</label>
<view>
<ciy-select :range="g.usertitle" name="menuid" v-model="form.usertitle"></ciy-select>
</view>
</view>
<view class="ciy-form">
<label>状态</label>
<view>
<ciy-radio left :range="g.role" name="sigstatus" v-model="form.role"></ciy-radio>
</view>
</view>
<view class="ciy-form">
<label>学历</label>
<view>
<ciy-select :range="g.education" name="menuid" v-model="form.education"></ciy-select>
</view>
</view>
<view class="ciy-form">
<label class="imp">编号</label>
<view>
<ciy-input name="name" v-model="form.sn" placeholder="请输入成员编号" required></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>性别</label>
<view>
<ciy-radio left :range="g.sex" name="sex" v-model="form.sex"></ciy-radio>
</view>
</view>
<view class="ciy-form">
<label>加入日期</label>
<view>
<ciy-inputdatetime name="date" v-model="form.addtimes"></ciy-inputdatetime>
</view>
</view>
<view class="ciy-form">
<label>手机号</label>
<view>
<ciy-input name="mobile" v-model="form.mobile" placeholder="请输入11位手机号"></ciy-input>
</view>
</view>
<view class="ciy-form">
<label>邮箱</label>
<view>
<ciy-input name="email" v-model="form.email" placeholder="请输入邮箱地址"></ciy-input>
</view>
</view>
<view class="ciy-form">
<label class="char4">修改密码</label>
<input
type="password"
v-model="form.pass"
placeholder="不修改密码请留空"
class="ciy-edit px2 py1 bg1 rounded"
/>
<view class="text-xs text-gray-500 mt1">
</view>
</view>
</form>
<view class="ciy-form-bottom mt4">
<button
class="btn man lgg long"
@click="submitForm"
:disabled="isSubmitting"
>
{{ isSubmitting ? '更新中...' : '更新成员信息' }}
</button>
</view>
</view>
</view>
</template>
<script>
import md5 from '@/util/md5.js';
export default {
props: {
id: {
type: [String, Number],
default: ''
}
},
data() {
return {
isSubmitting: false,
form: {
id: 0,
laborgid: 0,
stpstatus: 10,
userlevel: 10,
dvotecnt: 0,
name: '',
icon: '',
usertitle: 0,
role: 30,
education: 50,
sn: '',
sex: 90,
addtimes: 0,
mobile: '',
email: '',
pass: ''
}
};
},
onLoad(options) {
if (!options.id || parseInt(options.id) <= 0) {
this.toast('无效的成员ID无法进入编辑页面');
setTimeout(() => this.goBack(), 1500);
return;
}
this.form.id = parseInt(options.id);
this.getMemberDetail();
},
methods: {
goBack() {
uni.navigateBack({ delta: 1 });
},
async getMemberDetail() {
try {
const retjson = await this.callfunc({
func: 'adduser.info',
data: { id: this.form.id }
});
if (retjson.code !== 1) {
throw new Error(retjson.msg || '获取成员信息失败');
}
if (!retjson.data || typeof retjson.data !== 'object') {
throw new Error('成员信息格式异常,请重试');
}
const detail = retjson.data;
this.form = {
...this.form,
...detail,
addtimes: detail.addtimes * 1000,
pass: ''
};
} catch (err) {
this.toast(err.message);
console.error('拉取详情异常:', err);
}
},
async submitForm() {
if (!this.form.name) {
return this.toast('请输入成员姓名');
}
if (!this.form.addtimes) {
return this.toast('请选择加入日期');
}
if (this.form.mobile && !/^1[3-9]\d{9}$/.test(this.form.mobile)) {
return this.toast('请输入有效的11位手机号');
}
if (this.form.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this.form.email)) {
return this.toast('请输入有效的邮箱地址');
}
this.isSubmitting = true;
try {
const app = getApp();
const postData = { ...this.form };
postData.auth = (new Date()).getTime();
if (postData.pass) {
postData.pass = md5.md5(postData.pass + app.globalData.tokensalt);
} else {
delete postData.pass;
}
const retjson = await this.callfunc({
func: 'adduser.update',
data: postData
});
if (retjson.code !== 1) {
throw new Error(retjson.msg || '更新成员失败');
}
this.toast('更新成员信息成功');
setTimeout(() => this.goBack(), 1500);
} catch (err) {
this.toast(err.message);
console.error('提交编辑异常:', err);
} finally {
this.isSubmitting = false;
}
}
},
};
</script>
<style scoped>
.ciy-edit {
width: 100%;
height: 2rem;
border: 1px solid var(--bg6);
border-radius: 0.3rem;
}
.text-xs {
font-size: 0.75rem;
}
.text-gray-500 {
color: #9ca3af;
}
.mt1 {
margin-top: 0.25rem;
}
</style>

View File

@ -1,496 +0,0 @@
<template>
<view class="ciy-page container">
<!-- 页面头部搜索栏 + 新增按钮 -->
<ciy-header title="成员管理" ref="header"></ciy-header>
<view class="main-header bg-white px4 py3 flex flex-center justify-between shadow-sm">
<!-- 搜索框区域 -->
<view class="search-container flex flex1 mr3 relative">
<icon class="search-icon" type="search" size="14" color="#999" />
<input
type="text"
v-model="searchKey"
placeholder="请输入姓名/头衔搜索"
class="flex1 px4 py2 pl-12 bg-gray-50 border border-gray-200 rounded-lg focus-border-primary focus-ring-1"
@confirm="getMemberList"
/>
<button class="btn btn-primary ml2" @click="getMemberList">搜索</button>
</view>
<!-- 新增成员按钮缩小尺寸 -->
<button class="btn btn-success btn-sm" @click="goToAddMember">新增成员</button>
</view>
<!-- 状态筛选栏按成员状态过滤缩小按钮尺寸 -->
<view class="status-filter bg-white px4 py3 flex overflow-x-auto scrollbar-hide border-b border-gray-100">
<button
v-for="(item, key) in statusMap"
:key="key"
class="status-btn mr2 flex-none rounded-full py1 px3 transition-all duration-300"
:class="activeStatus === key ? 'status-btn-active' : 'status-btn-default'"
@click="handleStatusChange(key)"
>
{{ item }}
</button>
</view>
<!-- 成员列表区域卡片式展示每页6条缩小卡片及内部元素 -->
<view class="main bg-gray-50 flex1 overflow-auto px4 py4">
<!-- 无数据提示缩小尺寸 -->
<view v-if="memberList.length === 0" class="empty-tip txt-center py12 bg-white rounded-xl shadow-sm mx-auto w-4-5">
<view class="empty-icon bg-gray-100 w-12 h-12 rounded-full flex flex-center justify-center mx-auto mb3">
<text class="text-gray-400 text-xl">👤</text>
</view>
<view class="text-gray-400 text-base">暂无当前状态的成员数据</view>
</view>
<!-- 成员卡片网格3列布局缩小间距 -->
<view class="ciy-grid grid3 gap-3" v-else>
<view class="grid-item" v-for="(member, index) in memberList" :key="member.id">
<!-- 成员卡片缩小整体尺寸 -->
<view class="member-card bg-white rounded-xl shadow-md transition-all duration-300 overflow-hidden">
<!-- 文字头像缩小尺寸 -->
<view class="card-avatar txt-center py3">
<view
class="avatar-placeholder w-16 h-16 rounded-full border-3 border-white shadow-sm mx-auto flex flex-center justify-center"
:style="{ backgroundColor: getAvatarBgColor(member.role) }"
>
<text class="text-lg font-bold text-white">{{ member.name.substring(0, 1) }}</text>
</view>
</view>
<!-- 成员信息缩小文字及内边距 -->
<view class="card-info txt-center px3 py4">
<view class="member-name text-lg font-bold text-gray-800 mb1">{{ member.name }}</view>
<view class="member-title text-sm text-gray-500 mb2">{{ getTitleText(member.usertitle) }}</view>
<!-- 状态标签缩小尺寸 -->
<view class="member-status">
<span
class="px2 py1 rounded-full text-xs font-medium"
:style="{
backgroundColor: getTagBgColor(member.role),
color: '#FFFFFF'
}"
>
{{ statusMap[member.role] }}
</span>
</view>
</view>
</view>
</view>
</view>
<!-- 滚动加载提示缩小尺寸 -->
<view v-if="hasMoreData" class="load-more txt-center py4 text-gray-400">
<view class="flex flex-center justify-center">
<loading class="mr2" size="12"></loading>
<text class="text-sm">下拉加载更多...</text>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
searchKey: '', //
activeStatus: '', //
memberList: [], //
page: 1, //
pageSize: 6, //
hasMoreData: true, //
//
statusMap: {
10: '负责人',
20: '科研秘书',
30: '在册成员',
40: '历史成员',
50: '外部成员'
},
//
titleMap: {
10: '主任',
20: '副主任',
30: '顾问',
40: '名誉主任',
50: '教授',
60: '副教授',
70: '讲师',
80: '研究员',
0: '无头衔'
},
//
roleColors: {
10: '#2563EB', // -
20: '#9333EA', // -
30: '#10B981', // -绿
40: '#9CA3AF', // -
50: '#F97316' // -
}
};
},
onLoad() {
//
this.activeStatus = '';
this.getMemberList();
//
const main = uni.createSelectorQuery().in(this).select('.main');
main.onScroll((res) => {
const { scrollTop, scrollHeight, clientHeight } = res;
if (scrollTop + clientHeight >= scrollHeight - 100 && this.hasMoreData) {
this.page++;
this.getMemberList(true);
}
}).exec();
},
methods: {
//
async getMemberList(isAppend = false) {
//
const mockData = [
{ id: 1, name: '张三', usertitle: 10, role: 10 },
{ id: 2, name: '李四', usertitle: 50, role: 20 },
{ id: 3, name: '王五', usertitle: 80, role: 30 },
{ id: 4, name: '赵六', usertitle: 20, role: 40 },
{ id: 5, name: '孙七', usertitle: 60, role: 50 },
{ id: 6, name: '周八', usertitle: 70, role: 30 },
];
// +
let filteredData = mockData.filter(item => {
const statusMatch = this.activeStatus === '' || item.role === this.activeStatus;
const searchMatch = item.name.includes(this.searchKey) || this.titleMap[item.usertitle].includes(this.searchKey);
return statusMatch && searchMatch;
});
//
const paginatedData = filteredData.slice((this.page - 1) * this.pageSize, this.page * this.pageSize);
//
if (isAppend) {
this.memberList = [...this.memberList, ...paginatedData];
} else {
this.memberList = paginatedData;
}
//
this.hasMoreData = this.memberList.length < filteredData.length;
},
//
handleStatusChange(status) {
this.activeStatus = status;
this.page = 1;
this.getMemberList();
},
//
goToAddMember() {
uni.navigateTo({ url: '/pages/lab/useradd' });
},
//
getTitleText(usertitle) {
return this.titleMap[usertitle] || '未知头衔';
},
//
getTagBgColor(role) {
return this.roleColors[role] || '#E5E7EB';
},
//
getAvatarBgColor(role) {
return this.roleColors[role] || '#165DFF';
}
}
};
</script>
<style scoped>
/* 全局变量定义 */
:root {
--primary: #165DFF;
--success: #00B42A;
--gray-50: #F9FAFB;
--gray-100: #F3F4F6;
--gray-200: #E5E7EB;
--gray-400: #9CA3AF;
--gray-500: #6B7280;
--gray-800: #1F2937;
}
/* 容器布局 */
.container {
height: 100vh;
display: flex;
flex-direction: column;
}
/* 头部样式 */
.main-header {
position: sticky;
top: 0;
z-index: 10;
background-color: white;
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
padding: 12px 16px;
}
.search-container {
align-items: center;
}
.search-icon {
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
font-size: 14px;
}
.pl-12 {
padding-left: 2.5rem; /* 缩小内边距 */
}
/* 按钮样式(整体缩小) */
.btn {
border-radius: 8px;
font-weight: 500;
transition: all 0.3s ease;
font-size: 14px;
}
.btn-primary {
background-color: var(--primary);
color: white;
padding: 6px 12px; /* 缩小内边距 */
border: none;
}
.btn-primary:hover {
background-color: #0E4BDB;
}
.btn-success {
background-color: var(--success);
color: white;
border: none;
}
.btn-sm {
padding: 6px 12px; /* 小按钮内边距 */
font-size: 13px;
}
.btn-success:hover {
background-color: #009A22;
}
/* 状态筛选栏(缩小整体尺寸) */
.status-filter {
position: sticky;
top: 52px; /* 对应头部缩小后的高度 */
z-index: 9;
background-color: white;
border-bottom: 1px solid var(--gray-200);
padding: 12px 16px;
}
.scrollbar-hide::-webkit-scrollbar {
display: none;
}
.status-btn {
border: none;
font-weight: 500;
border-radius: 10px;
padding: 4px 12px; /* 缩小按钮内边距 */
margin-right: 8px; /* 缩小按钮间距 */
transition: all 0.3s ease;
font-size: 13px; /* 缩小文字尺寸 */
}
.status-btn-default {
background-color: var(--gray-50);
color: var(--gray-500);
}
.status-btn-default:hover {
background-color: var(--gray-100);
}
.status-btn-active {
background-color: #165DFF !important;
color: #FFFFFF !important;
}
/* 成员列表(缩小内边距) */
.main {
flex: 1;
background-color: var(--gray-50);
padding: 16px; /* 缩小内边距 */
}
.grid3 {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px; /* 缩小网格间距 */
}
/* 成员卡片(缩小整体尺寸) */
.member-card {
width: 100%;
box-sizing: border-box;
background-color: white;
border-radius: 10px; /* 缩小圆角 */
overflow: hidden;
transition: all 0.3s ease;
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
}
.member-card:hover {
box-shadow: 0 6px 16px -5px rgba(0, 0, 0, 0.05), 0 4px 8px -6px rgba(0, 0, 0, 0.03);
transform: translateY(-1px); /* 缩小hover上移距离 */
}
/* 头像区域(缩小尺寸) */
.card-avatar {
width: 100%;
background: linear-gradient(to bottom, #EFF6FF, #EEF2FF);
padding: 12px 0; /* 缩小内边距 */
text-align: center;
}
.avatar-placeholder {
width: 4rem; /* 缩小头像尺寸 */
height: 4rem;
border-radius: 50%;
border: 3px solid white;
box-shadow: 0 1px 3px rgba(0,0,0,0.05);
display: flex;
align-items: center;
justify-content: center;
font-size: 1rem; /* 缩小文字尺寸 */
}
/* 成员信息(缩小内边距和文字尺寸) */
.card-info {
padding: 16px 12px; /* 缩小内边距 */
text-align: center;
}
.member-name {
font-size: 1rem; /* 缩小姓名文字 */
font-weight: 700;
color: var(--gray-800);
margin-bottom: 4px; /* 缩小间距 */
line-height: 1.3;
}
.member-title {
font-size: 12px; /* 缩小头衔文字 */
color: var(--gray-500);
margin-bottom: 8px; /* 缩小间距 */
line-height: 1.2;
}
/* 无数据提示(缩小尺寸) */
.empty-tip {
padding: 32px 16px; /* 缩小内边距 */
width: 80%;
margin: 0 auto;
background-color: white;
border-radius: 10px; /* 缩小圆角 */
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
text-align: center;
}
.empty-icon {
width: 3rem; /* 缩小图标尺寸 */
height: 3rem;
border-radius: 50%;
background-color: var(--gray-100);
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 12px; /* 缩小间距 */
font-size: 1rem; /* 缩小图标文字 */
}
/* 滚动加载(缩小尺寸) */
.load-more {
margin-top: 16px; /* 缩小间距 */
font-size: 12px; /* 缩小文字尺寸 */
color: var(--gray-400);
text-align: center;
}
/* 聚焦样式 */
.focus-border-primary:focus {
border-color: var(--primary);
}
.focus-ring-1:focus {
box-shadow: 0 0 0 1px var(--primary);
}
/* 文本颜色辅助类(新增小尺寸文字类) */
.text-white {
color: #FFFFFF;
}
.text-gray-400 {
color: #9CA3AF;
}
.text-gray-500 {
color: #6B7280;
}
.text-gray-800 {
color: #1F2937;
}
.text-xl {
font-size: 1.25rem;
}
.text-lg {
font-size: 1rem;
}
.text-base {
font-size: 0.875rem;
}
.text-sm {
font-size: 0.75rem;
}
.text-xs {
font-size: 0.625rem;
}
/* 内边距辅助类(缩小尺寸) */
.px2 {
padding-left: 0.5rem;
padding-right: 0.5rem;
}
.py1 {
padding-top: 0.25rem;
padding-bottom: 0.25rem;
}
.mb1 {
margin-bottom: 0.25rem;
}
.mb2 {
margin-bottom: 0.5rem;
}
</style>

View File

@ -22,7 +22,7 @@
<view class="icon" :style="{backgroundImage:svg2bg(svg.cqd)}"></view>
<view class="name">游客页面</view>
</view>
<view class="grid" @tap="gourl" data-url="$/pages/lab/userlist">
<view class="grid" @tap="gourl" data-url="$/pages/lab/user_list">
<view class="icon" :style="{backgroundImage:svg2bg(svg.cjf)}"></view>
<view class="name">成员管理</view>
</view>
@ -30,14 +30,14 @@
<view class="icon" :style="{backgroundImage:svg2bg(svg.cmh)}"></view>
<view class="name">原型演示</view>
</view>
<view class="grid" @tap="gourl" data-url="$/pages/lab/list">
<view class="icon" :style="{backgroundImage:svg2bg(svg.cmh)}"></view>
<view class="name">在研课题备案</view>
</view>
<view class="grid" @tap="gourl" data-url="$/pages/lab/list">
<view class="grid" @tap="gourl" data-url="$/pages/lab/project_list">
<view class="icon" :style="{backgroundImage:svg2bg(svg.cmh)}"></view>
<view class="name">组会管理</view>
</view>
<view class="grid" @tap="gourl" data-url="$/pages/lab/project_list">
<view class="icon" :style="{backgroundImage:svg2bg(svg.cmh)}"></view>
<view class="name">在研课题备案</view>
</view>
<view class="grid" @tap="gourl" data-url="$/pages/lab/list">
<view class="icon" :style="{backgroundImage:svg2bg(svg.cmh)}"></view>
<view class="name">平等研讨</view>
@ -54,6 +54,10 @@
<view class="icon" :style="{backgroundImage:svg2bg(svg.cmh)}"></view>
<view class="name">经验积累</view>
</view>
<view class="grid" @tap="gourl" data-url="$/pages/lab/user_list">
<view class="icon" :style="{backgroundImage:svg2bg(svg.cmh)}"></view>
<view class="name">deom</view>
</view>
</view>
</view>
<view class="ciy-caption mk sti" :style="{top:(header_statusbar_height+header_title_height)+'px'}">

View File

@ -2508,6 +2508,7 @@ export default {
.getSeconds() + '_' +
(1000 + Math.round(Math.random() * 8000)) + '.' + fext.toLowerCase();
if (opn.stor == '/') {
var needobjurl = false;
var ufparam = {};
ufparam.url = opn.action + "upload?pathfile=" + pathfile;
ufparam.header = header;
@ -2517,9 +2518,19 @@ export default {
ufparam.filePath = filepath;
ufparam.name = 'file';
} else {
ufparam.file = gf;
var fread = new FileReader();
fread.readAsDataURL(gf);
var err = await this.goe(this.go_load(fread));
if (err)
return fn.fail('FileReader LoadObjUrl Error', gf, err);
ufparam.filePath = URL.createObjectURL(gf);
needobjurl = true;
ufparam.name = 'file';
}
var [err, retupfile] = await this.go(uni.uploadFile(ufparam));
if (needobjurl)
URL.revokeObjectURL(ufparam.filePath);
if (err)
return fn.fail(err.errMsg, gf, err);
var jsonup = this.json_parse(retupfile.data);

408
lab.sql
View File

@ -1,408 +0,0 @@
CREATE TABLE `lab_orgbase` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR (100) NOT NULL COMMENT '全称',
`shortname` VARCHAR (50) NOT NULL COMMENT '简称',
`areacode` BIGINT NOT NULL COMMENT '所在地区,CATM,ciy_arearpc',
`addr` VARCHAR (100) NOT NULL COMMENT '地址',
`lat` DOUBLE NOT NULL COMMENT '',
`lng` DOUBLE NOT NULL COMMENT '地理位置,LOC,lat',
`signname` VARCHAR (50) NOT NULL COMMENT '签约人',
`contact` VARCHAR (50) NOT NULL COMMENT '联系方式',
`email` VARCHAR (50) NOT NULL COMMENT '邮箱',
`addtimes` BIGINT NOT NULL COMMENT '开通日,DATE,Y-m-d', -- 新增“开通日期”字段
`exptimes` BIGINT NOT NULL COMMENT '到期日,DATE,Y-m-d',
PRIMARY KEY (`id`)
) COMMENT = '科研机构';
CREATE TABLE `lab_user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`name` VARCHAR (50) NOT NULL COMMENT '姓名',
`usertitle` INT NOT NULL COMMENT '头衔,CATA,usertitle',
`sn` VARCHAR (50) NOT NULL COMMENT '编号',
`sex` INT NOT NULL COMMENT '性别,CATA,sex',
`addtimes` BIGINT NOT NULL COMMENT '加入日期,DATE,Y-m-d',
`mobile` VARCHAR (50) NOT NULL COMMENT '手机号,MSK,****',
`email` VARCHAR (100) NOT NULL COMMENT '信箱',
`password` VARCHAR (100) NOT NULL COMMENT ',密码',
`stpstatus` INT NOT NULL COMMENT '|状态|,CATA,stpstatus',
`userlevel` INT NOT NULL COMMENT '|等级|,CATA,userlevel',
`totalpnt` BIGINT NOT NULL COMMENT '总积分|,INT',
`dvotecnt` BIGINT NOT NULL COMMENT '互动贡献|,INT,次',
PRIMARY KEY (
`id`
)) COMMENT = '实验室成员';
CREATE TABLE `lab_usronline` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`vuser` BIGINT NOT NULL COMMENT '所属成员,CATU,labuser',
`targettype` INT NOT NULL COMMENT '登录来源',
`sid` VARCHAR (50) NOT NULL COMMENT 'SID',
`logintimes` BIGINT NOT NULL COMMENT '登录时间,DATE',
`exptimes` BIGINT NOT NULL COMMENT '过期时间,DATE',
`ip` VARCHAR (50) NOT NULL COMMENT 'IP',
PRIMARY KEY (
`id`
)) COMMENT = '成员在线';
CREATE TABLE `lab_rproject` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`isweb` INT NOT NULL COMMENT '是否公开,BOOL',
`rcate` INT NOT NULL COMMENT '科研类目,CATA,rcate',
`name` VARCHAR (180) NOT NULL COMMENT '标题',
`descs` VARCHAR (180) NOT NULL COMMENT '摘要,BR',
`mdeptname` VARCHAR (100) NOT NULL COMMENT '主管部门',
`mdeptlevel` VARCHAR (50) NOT NULL COMMENT '层次',
`budgetmoney` BIGINT NOT NULL COMMENT '预算|,CNY',
`serviceorg` VARCHAR (100) NOT NULL COMMENT '服务机构',
`rprojectstatus` INT NOT NULL COMMENT '|状态|,CATA,rprojectstatus',
`vuser` BIGINT NOT NULL COMMENT '负责人,CATU,labuser',
`progress` INT NOT NULL COMMENT '|进度|,PCT',
`lasttimes` BIGINT NOT NULL COMMENT '最新进展,DATE,Y-m-d',
`numachive` VARCHAR (100) NOT NULL COMMENT '编号成果',
PRIMARY KEY (
`id`
)) COMMENT = '在研课题';
CREATE TABLE `lab_rprojmember` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`rprojectid` BIGINT NOT NULL COMMENT '所属课题,DB,lab_rproject',
`vuser` BIGINT NOT NULL COMMENT '所属成员,CATU,labuser',
`mainduty` VARCHAR (180) NOT NULL COMMENT '主要职责',
`addtimes` BIGINT NOT NULL COMMENT '参与日期,DATE,Y-m-d',
PRIMARY KEY (
`id`
)) COMMENT = '课题成员';
CREATE TABLE `lab_rprojprogress` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`rprojectid` BIGINT NOT NULL COMMENT '所属课题,DB,lab_rproject',
`vuser` BIGINT NOT NULL COMMENT '所属成员,CATU,labuser',
`content` TEXT NOT NULL COMMENT ',进展内容,MD',
`addtimes` BIGINT NOT NULL COMMENT '进展日期,DATE',
`rppfiles` VARCHAR (180) NOT NULL COMMENT '进展附件,DOWN',
PRIMARY KEY (
`id`
)) COMMENT = '课题进展';
CREATE TABLE `lab_achievement` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`rcate` INT NOT NULL COMMENT '科研类目,CATA,rcate',
`name` VARCHAR (100) NOT NULL COMMENT '名称',
`numachive` VARCHAR (100) NOT NULL COMMENT '编号成果',
`descs` VARCHAR (180) NOT NULL COMMENT '摘要,BR',
`amurl` VARCHAR (180) NOT NULL COMMENT '链接,DOWN',
`ampdf` VARCHAR (50) NOT NULL COMMENT 'PDF,DOWN',
`pubtimes` BIGINT NOT NULL COMMENT '发表日期,DATE,Y-m-d',
`author` VARCHAR (100) NOT NULL COMMENT '负责人',
PRIMARY KEY (
`id`
)) COMMENT = '科研成果';
CREATE TABLE `lab_achievemember` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`achievementid` BIGINT NOT NULL COMMENT '所属成果,DB,lab_achievement',
`vuser` BIGINT NOT NULL COMMENT '所属成员,CATU,labuser',
`name` VARCHAR (50) NOT NULL COMMENT '|姓名|',
`email` VARCHAR (100) NOT NULL COMMENT '邮箱',
`seqno` INT NOT NULL COMMENT '|顺序位|',
`maincontribution` VARCHAR (180) NOT NULL COMMENT '主要贡献',
PRIMARY KEY (
`id`
)) COMMENT = '成果贡献人';
CREATE TABLE `lab_discussion` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`name` VARCHAR (180) NOT NULL COMMENT '研讨标题',
`vuser` BIGINT NOT NULL COMMENT '发起人,CATU,labuser',
`addtimes` BIGINT NOT NULL COMMENT '发起日期,DATE,Y-m-d',
`closetimes` BIGINT NOT NULL COMMENT '关闭日期,DATE,Y-m-d',
`interactioncnt` BIGINT NOT NULL COMMENT '互动数|',
`visitcnt` BIGINT NOT NULL COMMENT '访问量|',
`lasttimes` BIGINT NOT NULL COMMENT '最后活跃时间,DATE',
PRIMARY KEY (
`id`
)) COMMENT = '研讨';
CREATE TABLE `lab_discusstate` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`discussionid` BIGINT NOT NULL COMMENT '所属研讨,DB,lab_discussion',
`discuscommentid` BIGINT NOT NULL COMMENT '所属评论,DB,lab_discuscomment',
`dstate` INT NOT NULL COMMENT '表态,CATA,dstate',
`addtimes` BIGINT NOT NULL COMMENT '表态时间,DATE',
PRIMARY KEY (
`id`
)) COMMENT = '研讨表态';
CREATE TABLE `lab_discuscomment` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`discussionid` BIGINT NOT NULL COMMENT '所属研讨,DB,lab_discussion',
`upid` BIGINT NOT NULL COMMENT '所属评论,DB,lab_discuscomment',
`content` TEXT NOT NULL COMMENT ',评论内容,MD',
`addtimes` BIGINT NOT NULL COMMENT '评论日期,DATE',
`approvecnt` BIGINT NOT NULL COMMENT '赞成数|',
`opposecnt` BIGINT NOT NULL COMMENT '反对数|',
PRIMARY KEY (
`id`
)) COMMENT = '研讨评论';
CREATE TABLE `lab_gmeeting` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`name` VARCHAR (180) NOT NULL COMMENT '标题',
`starttimes` BIGINT NOT NULL COMMENT '开始时间,DATE',
`plansec` INT NOT NULL COMMENT '预计用时,SEC',
`usesec` INT NOT NULL COMMENT '实际用时,SEC',
`maintopic` VARCHAR (250) NOT NULL COMMENT '主要议题',
`addr` VARCHAR (180) NOT NULL COMMENT '地址',
`vuser` BIGINT NOT NULL COMMENT '主持人,CATU,labuser',
`joincnt` INT NOT NULL COMMENT '与会人数,INT,人',
`addtimes` BIGINT NOT NULL COMMENT '发布时间,DATE',
PRIMARY KEY (
`id`
)) COMMENT = '组会';
CREATE TABLE `lab_gmeetmember` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`gmeetingid` BIGINT NOT NULL COMMENT '所属组会,DB,lab_gmeeting',
`vuser` BIGINT NOT NULL COMMENT '所属成员,CATU,labuser',
`gmeetingusrstatus` INT NOT NULL COMMENT '|状态|,CATA,gmeetingusrstatus',
`nexttimes` BIGINT NOT NULL COMMENT '下次通知日期,DATE,Y-m-d',
`gmeetingusrsign` INT NOT NULL COMMENT '签到,CATA,gmeetingusrsign',
PRIMARY KEY (
`id`
)) COMMENT = '组会成员';
CREATE TABLE `lab_experience` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`name` VARCHAR (180) NOT NULL COMMENT '一句话概括',
`content` TEXT NOT NULL COMMENT '详情,BR',
`vfiles` VARCHAR (180) NOT NULL COMMENT '文档附件,IMG',
`addtimes` BIGINT NOT NULL COMMENT '发布日期,DATE,Y-m-d',
`vuser` BIGINT NOT NULL COMMENT '发布人,CATU,labuser',
PRIMARY KEY (
`id`
)) COMMENT = '经验积累';
CREATE TABLE `lab_experienvisit` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`experienceid` BIGINT NOT NULL COMMENT '所属经验,DB,lab_experience',
`vuser` BIGINT NOT NULL COMMENT '访问人,CATU,labuser',
`addtimes` BIGINT NOT NULL COMMENT '访问日期,DATE,Y-m-d',
PRIMARY KEY (
`id`
)) COMMENT = '访问记录';
CREATE TABLE `lab_fundproject` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`name` VARCHAR (100) NOT NULL COMMENT '项目名称',
`totalmoney` BIGINT NOT NULL COMMENT '可用总经费|,CNY',
`closetime` BIGINT NOT NULL COMMENT '关闭时间,DATE,Y-m-d',
PRIMARY KEY (
`id`
)) COMMENT = '项目经费';
CREATE TABLE `lab_fundcate` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`name` VARCHAR (100) NOT NULL COMMENT '分项名',
`descs` VARCHAR (180) NOT NULL COMMENT '解释说明,BR',
`vfile` VARCHAR (50) NOT NULL COMMENT '示例附件,DOWN',
PRIMARY KEY (
`id`
)) COMMENT = '分项分类';
CREATE TABLE `lab_funditem` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`fundprojectid` BIGINT NOT NULL COMMENT '所属项目经费,DB,lab_fundproject',
`fundcateid` BIGINT NOT NULL COMMENT '所属分项分类,DB,lab_fundcate',
`usablemoney` BIGINT NOT NULL COMMENT '可用经费|,CNY',
`memo` VARCHAR (180) NOT NULL COMMENT '备注',
PRIMARY KEY (
`id`
)) COMMENT = '项目分项经费';
CREATE TABLE `lab_fundexpense` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`vuser` BIGINT NOT NULL COMMENT '报销人,CATU,labuser',
`name` VARCHAR (180) NOT NULL COMMENT '事由',
`fundexpensestatus` INT NOT NULL COMMENT '|状态|,CATA,fundexpensestatus',
`totalamount` BIGINT NOT NULL COMMENT '总金额|,CNY',
`receiptcount` INT NOT NULL COMMENT '票据数量|,INT,张',
`fefiles` VARCHAR (180) NOT NULL COMMENT '电子票据附件,IMG',
`reason` VARCHAR (180) NOT NULL COMMENT '驳回理由',
`submittimes` BIGINT NOT NULL COMMENT '提交日期,DATE',
`financetimes` BIGINT NOT NULL COMMENT '财务日期,DATE',
`paymenttimes` BIGINT NOT NULL COMMENT '打款日期,DATE',
`actualamount` BIGINT NOT NULL COMMENT '实报金额|,CNY',
`assistantuser` BIGINT NOT NULL COMMENT '协助人,CATU,labuser',
PRIMARY KEY (
`id`
)) COMMENT = '经费报销';
CREATE TABLE `lab_fundexpendetail` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`fundexpenseid` BIGINT NOT NULL COMMENT '所属报销,DB,lab_fundexpense',
`funditemid` BIGINT NOT NULL COMMENT '所属分项经费,DB,lab_funditem',
`fedamount` BIGINT NOT NULL COMMENT '金额|,CNY',
`memo` VARCHAR (180) NOT NULL COMMENT '备注',
PRIMARY KEY (
`id`
)) COMMENT = '报销明细';
CREATE TABLE `lab_realasset` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构 ID,DB,lab_orgbase',
`name` VARCHAR (180) NOT NULL COMMENT '资产名称',
`sn` VARCHAR (50) NOT NULL COMMENT '资产编号',
`num` INT NOT NULL COMMENT '数量|,INT,个',
`pos` VARCHAR (180) NOT NULL COMMENT '位置',
`vuser` BIGINT NOT NULL COMMENT '管理人,CATU,labuser',
`addtimes` BIGINT NOT NULL COMMENT '加入日期,DATE,Y-m-d',
`lduser` VARCHAR (100) NOT NULL COMMENT '使用人',
`ldtimes` BIGINT NOT NULL COMMENT '使用时间,DATE',
`memo` VARCHAR (180) NOT NULL COMMENT '备注',
PRIMARY KEY (
`id`
)) COMMENT = '实验室实物资产';
CREATE TABLE `lab_webmain` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`templatepath` VARCHAR (180) NOT NULL COMMENT '模版路径',
`binddomain` VARCHAR (100) NOT NULL COMMENT '绑定独立域名',
`predomain` VARCHAR (50) NOT NULL COMMENT '三级域名',
`labintro` TEXT NOT NULL COMMENT ',实验室简介,MD',
`founder` TEXT NOT NULL COMMENT ',主任事迹,MD',
`uptimes` BIGINT NOT NULL COMMENT '更新时间,DATE',
PRIMARY KEY (
`id`
)) COMMENT = '官网模版';
CREATE TABLE `lab_webachievement` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`achievementid` BIGINT NOT NULL COMMENT '所属成果,DB,lab_achievement',
`keytag` VARCHAR (50) NOT NULL COMMENT '关键词标签',
`ispub` INT NOT NULL COMMENT '公开详情,BOOL',
`visitcnt` BIGINT NOT NULL COMMENT '访问量|',
`vuser` BIGINT NOT NULL COMMENT '添加人,CATU,labuser',
`addtimes` BIGINT NOT NULL COMMENT '添加时间,DATE,Y-m-d',
PRIMARY KEY (
`id`
)) COMMENT = '官网成果';
CREATE TABLE `lab_weblead` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`mobile` VARCHAR (50) NOT NULL COMMENT '手机号,MSK,****',
`name` VARCHAR (50) NOT NULL COMMENT '联系人',
`sourceurl` VARCHAR (180) NOT NULL COMMENT '来源页面,URL',
`demand` VARCHAR (180) NOT NULL COMMENT '需求',
`addtimes` BIGINT NOT NULL COMMENT '提交日期,DATE,Y-m-d',
`vuser` BIGINT NOT NULL COMMENT '对接人,CATU,labuser',
`contracttimes` BIGINT NOT NULL COMMENT '最后沟通时间,DATE',
`contractcontent` TEXT NOT NULL COMMENT '最后沟通记录,BR',
PRIMARY KEY (
`id`
)) COMMENT = '官网线索';
CREATE TABLE `lab_webmember` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`vuser` BIGINT NOT NULL COMMENT '所属成员,CATU,labuser',
`photo` VARCHAR (50) NOT NULL COMMENT '近照,IMG1',
`pintro` TEXT NOT NULL COMMENT ',个人介绍,MD',
`uptimes` BIGINT NOT NULL COMMENT '更新日期,DATE',
PRIMARY KEY (
`id`
)) COMMENT = '官网成员';
CREATE TABLE `lab_lang` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`lang` VARCHAR (50) NOT NULL COMMENT '语言代码,CATA,lang',
`tabname` VARCHAR (50) NOT NULL COMMENT '表名称',
`fieldname` VARCHAR (50) NOT NULL COMMENT '字段名',
`tabid` BIGINT NOT NULL COMMENT 'ID',
`trantxt` VARCHAR (250) NOT NULL COMMENT '翻译文本',
`langstatus` INT NOT NULL COMMENT '|状态|,CATA,langstatus',
PRIMARY KEY (
`id`
)) COMMENT = '多语言';
CREATE TABLE `lab_orgorder` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`orgsaleplanid` BIGINT NOT NULL COMMENT '销售方案,DB,lab_orgsaleplan',
`recvamount` BIGINT NOT NULL COMMENT '收款金额|,CNY',
`vuser` BIGINT NOT NULL COMMENT '操作人,CATU,labuser',
`addtimes` BIGINT NOT NULL COMMENT '创建时间,DATE',
`memo` VARCHAR (180) NOT NULL COMMENT '备注',
`invoicecate` VARCHAR (180) NOT NULL COMMENT '发票类目',
PRIMARY KEY (
`id`
)) COMMENT = '机构业务订单';
CREATE TABLE `lab_orgsaleplan` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR (100) NOT NULL COMMENT '方案名称',
`daycyc` INT NOT NULL COMMENT '递延时长,CYC',
`planprice` BIGINT NOT NULL COMMENT '标价|,CNY',
PRIMARY KEY (
`id`
)) COMMENT = '销售方案';
CREATE TABLE `lab_marriedori` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`laborgid` BIGINT NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`name` VARCHAR (100) NOT NULL COMMENT '干系人',
`onecap` VARCHAR (180) NOT NULL COMMENT '能力,BR',
`onedem` VARCHAR (180) NOT NULL COMMENT '需求,BR',
`uptimes` BIGINT NOT NULL COMMENT '更新日期,DATE,Y-m-d',
PRIMARY KEY (
`id`
)) COMMENT = '撮合元数据';
CREATE TABLE `lab_marriedchg` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`marriedoriid` BIGINT NOT NULL COMMENT '所属元数据,DB,lab_marriedori',
`mchan` INT NOT NULL COMMENT '信息渠道,CATA,mchan',
`chgdata` TEXT NOT NULL COMMENT ',变动数据',
`addtimes` BIGINT NOT NULL COMMENT '变动日期,DATE,Y-m-d',
`vuser` BIGINT NOT NULL COMMENT '变动人,CATU,labuser',
`adminuser` BIGINT NOT NULL COMMENT '监管人,CATU,labuser',
`mfen` INT NOT NULL COMMENT '打分|,INT,分',
PRIMARY KEY (
`id`
)) COMMENT = '元数据变动';
CREATE TABLE `lab_crmbase` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR (100) NOT NULL COMMENT '单位名称',
`crmsource` INT NOT NULL COMMENT '数据来源,CATA,crmsource',
`content` VARCHAR (250) NOT NULL COMMENT '干系数据,BR',
`crmlevel` INT NOT NULL COMMENT '标记,CATA,crmlevel',
`lat` DOUBLE NOT NULL COMMENT '地图位置',
`lng` DOUBLE NOT NULL COMMENT '地图位置,LOC,lat',
`followtimes` BIGINT NOT NULL COMMENT '最新跟进日期,DATE,Y-m-d',
`vuser` BIGINT NOT NULL COMMENT '销售人,CATU,labuser',
PRIMARY KEY (
`id`
)) COMMENT = '客户CRM';
CREATE TABLE `lab_crmfollow` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`crmid` BIGINT NOT NULL COMMENT '所属单位,DB,lab_crmbase',
`content` TEXT NOT NULL COMMENT '跟进内容,BR',
`addtimes` BIGINT NOT NULL COMMENT '跟进时间,DATE',
`vuser` BIGINT NOT NULL COMMENT '跟进人,CATU,labuser',
PRIMARY KEY (
`id`
)) COMMENT = '销售跟进';

54
lab_orgbase.sql Normal file
View File

@ -0,0 +1,54 @@
/*
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: 28/02/2026 18:28:19
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for lab_orgbase
-- ----------------------------
DROP TABLE IF EXISTS `lab_orgbase`;
CREATE TABLE `lab_orgbase` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '全称',
`shortname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '简称',
`areacode` bigint(20) NOT NULL COMMENT '所在地区,CATM,ciy_arearpc',
`addr` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '地址',
`lat` double NOT NULL,
`lng` double NOT NULL COMMENT '地理位置,LOC,lat',
`signname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '签约人',
`contact` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '联系方式',
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '邮箱',
`addtimes` bigint(20) NOT NULL COMMENT '开通日,DATE,Y-m-d',
`exptimes` bigint(20) NOT NULL COMMENT '到期日,DATE,Y-m-d',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '科研机构' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of lab_orgbase
-- ----------------------------
INSERT INTO `lab_orgbase` VALUES (1, '清华大学科研合作中心', '清华科合', 100000, '北京市海淀区清华园1号', 39.9968, 116.3275, '张伟', '李强 13800138000', 'contact@tsinghua.edu.cn', 1704067200, 1735689600);
INSERT INTO `lab_orgbase` VALUES (2, '中国科学院上海分院生物研究所', '中科院生研所', 200000, '上海市徐汇区岳阳路319号', 31.2304, 121.4737, '王芳', '赵敏 13900139000', 'bio@cas.ac.cn', 1704067200, 1735689600);
INSERT INTO `lab_orgbase` VALUES (3, '北京大学生命科学研究院', '北大生研院', 100000, '北京市海淀区颐和园路5号', 39.9867, 116.3088, '刘洋', '陈静 13700137000', 'life@pku.edu.cn', 1704067200, 1735689600);
INSERT INTO `lab_orgbase` VALUES (4, '浙江大学计算机学院创新中心', '浙大计创', 330000, '浙江省杭州市西湖区余杭塘路866号', 30.2858, 120.0977, '孙明', '周华 13600136000', 'comp@zju.edu.cn', 1704067200, 1735689600);
INSERT INTO `lab_orgbase` VALUES (5, '复旦大学附属医院医学研究中心', '复旦医研', 200000, '上海市杨浦区政立路680号', 31.3042, 121.5287, '吴霞', '郑勇 13500135000', 'med@fudan.edu.cn', 1704067200, 1735689600);
INSERT INTO `lab_orgbase` VALUES (6, '哈尔滨工业大学航天工程研究院', '哈工大航研', 230000, '黑龙江省哈尔滨市南岗区西大直街92号', 45.7584, 126.6438, '钱进', '黄磊 13400134000', 'space@hit.edu.cn', 1704067200, 1735689600);
INSERT INTO `lab_orgbase` VALUES (7, '中山大学海洋与地球科学学院', '中大海地', 440000, '广东省广州市海珠区新港西路135号', 23.0993, 113.3541, '陈涛', '林峰 13300133000', 'marine@sysu.edu.cn', 1704067200, 1735689600);
INSERT INTO `lab_orgbase` VALUES (8, '武汉大学测绘遥感信息工程国家重点实验室', '武大测遥', 430000, '湖北省武汉市洪山区珞喻路129号', 30.5432, 114.3748, '周杰', '许亮 13200132000', 'gis@whu.edu.cn', 1704067200, 1735689600);
INSERT INTO `lab_orgbase` VALUES (9, '西安交通大学电子与信息工程学院', '西交电信', 610000, '陕西省西安市雁塔区兴庆路245号', 34.2335, 108.9499, '马超', '何平 13100131000', 'eie@xjtu.edu.cn', 1704067200, 1735689600);
INSERT INTO `lab_orgbase` VALUES (10, '华中科技大学同济医学院附属协和医院', '协和医院', 430000, '湖北省武汉市江汉区解放大道1277号', 30.5892, 114.3095, '杨柳', '张伟 13000130000', 'hospital@hust.edu.cn', 1704067200, 1735689600);
SET FOREIGN_KEY_CHECKS = 1;

37
lab_projectmember.sql Normal file
View File

@ -0,0 +1,37 @@
/*
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: 05/03/2026 12:14:29
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for lab_projectmember
-- ----------------------------
DROP TABLE IF EXISTS `lab_projectmember`;
CREATE TABLE `lab_projectmember` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`pid` bigint(20) NOT NULL COMMENT '项目ID,关联lab_rproject.id',
`uid` bigint(20) NOT NULL COMMENT '成员ID,关联lab_user.id',
`prole` int(11) NULL DEFAULT NULL COMMENT '角色,cata',
`ctime` bigint(20) NOT NULL COMMENT '加入时间戳',
`utime` bigint(20) NOT NULL COMMENT '更新时间戳',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_pid_uid`(`pid`, `uid`) USING BTREE,
INDEX `idx_pid`(`pid`) USING BTREE,
INDEX `idx_uid`(`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 51 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目成员关联表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;

60
lab_rproject.sql Normal file
View File

@ -0,0 +1,60 @@
/*
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: 05/03/2026 11:37:26
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for lab_rproject
-- ----------------------------
DROP TABLE IF EXISTS `lab_rproject`;
CREATE TABLE `lab_rproject` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增id',
`recordtime` bigint(20) NOT NULL COMMENT '备案开始时间',
`recordno` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '备案编号,唯一标识',
`laborgid` bigint(20) NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`orgname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属机构全称',
`isweb` int(11) NOT NULL DEFAULT 0 COMMENT '是否公开,BOOL0=不公开1=公开)',
`rcate` int(11) NOT NULL COMMENT '科研类目,CATA,rcate',
`name` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '课题标题',
`descs` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '摘要,BR',
`mdeptname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主管部门',
`mdeptlevel` int(50) NOT NULL COMMENT '主管部门层次',
`budgetmoney` bigint(20) NOT NULL COMMENT '预算|,CNY',
`serviceorg` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '服务机构',
`rprojectstatus` int(11) NOT NULL COMMENT '|状态|,CATA,rprojectstatus',
`principal_id` bigint(20) NULL DEFAULT 0 COMMENT '负责人id',
`principal_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '负责人姓名',
`progress` int(11) NOT NULL COMMENT '|进度|,PCT',
`lasttimes` bigint(20) NOT NULL COMMENT '最新进展,DATE,Y-m-d',
`latestcontent` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '进展内容,MD',
`latestattachment` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '最新附件',
`direction` int(50) NULL DEFAULT NULL COMMENT '备案方向, CATA, direction',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 24 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of lab_rproject
-- ----------------------------
INSERT INTO `lab_rproject` VALUES (16, 1704067200, 'REC-2024-NSU-001', 19, '西安电子科技大学网络空间安全学院', 10, 10, '二维材料的量子输运特性研究', '本项目旨在探索新型二维材料的量子输运现象,开发其在未来电子器件中的应用潜力。', '南方科技大学科研处', 30, 5000000, '南方科技大学财务处', 10, 20, '任小军', 95, 1772380, '完成初步理论模型构建和仿真。', '/attachments/nsu_qtransport_v1.pdf', 101);
INSERT INTO `lab_rproject` VALUES (17, 1704067200, 'REC-2024-BUAA-001', 17, '北京航空航天大学人工智能研究院', 10, 20, '基于深度强化学习的无人机自主导航系统', '研发能够在复杂动态环境中自主决策和导航的无人机系统。', '北京航空航天大学科研部', 30, 8000000, '北京航空航天大学采购中心', 10, 112, '胡一凡', 15, 1770815000, '完成仿真环境搭建和初步算法测试。', '/attachments/buaa_drone_nav_v1.pdf', 7021);
INSERT INTO `lab_rproject` VALUES (18, 1704067200, 'REC-2024-ECNU-001', 18, '华东师范大学河口海岸科学研究院', 0, 30, '长江口微塑料污染时空分布及生态风险评估', '调查长江口区域微塑料污染现状,评估其对生态系统的影响。', '华东师范大学科技处', 30, 3000000, '华东师范大学后勤保障部', 20, 113, '林海波', 40, 1770814000, '完成第一阶段水样采集和初步分析。', '/attachments/ecnu_microplastics_v1.pdf', 301);
INSERT INTO `lab_rproject` VALUES (19, 1704067200, 'REC-2024-XIDIAN-001', 19, '西安电子科技大学网络空间安全学院', 1, 40, '面向工业互联网的零信任架构安全策略研究', '研究适用于工业互联网环境的零信任安全模型与实施策略。', '西安电子科技大学科学技术研究院', 30, 6000000, '西安电子科技大学信息化建设处', 10, 114, '张思远', 10, 1770813000, '完成需求分析和技术方案初稿。', '/attachments/xidian_zt_v1.pdf', 401);
INSERT INTO `lab_rproject` VALUES (20, 1704067200, 'REC-2024-DLUT-001', 20, '大连理工大学精细化工国家重点实验室', 0, 50, '高性能聚合物电解质在固态锂电池中的应用', '开发用于下一代固态锂电池的新型聚合物电解质材料。', '大连理工大学科学技术研究院', 30, 7000000, '大连理工大学招标与采购管理办公室', 20, 115, '王建民', 30, 1770812000, '完成聚合物合成路线优化。', '/attachments/dlut_polymelectrolyte_v1.pdf', 501);
INSERT INTO `lab_rproject` VALUES (21, 1772386912, 'TEST-2024-001', 19, '西安电子科技大学网络空间安全学院', 10, 20, '智能数据分析平台研发', '本项目旨在开发一个高效、易用的智能数据分析平台,集成多种算法模型。', '科技发展部', 50, 9000000, '技术服务公司', 30, 22, '小韩', 60, 1772380, '', '/2026/0302/demo/13537_4868.jpg', 402);
INSERT INTO `lab_rproject` VALUES (23, 1772388583, 'IRP-2026-001', 19, '西安电子科技大学网络空间安全学院', 10, 20, '智能物流仓储优化系统', '本课题旨在研究和开发一套基于人工智能算法的智能物流仓储优化系统。该系统将运用机器学习、路径规划和大数据分析技术,实现对仓储货物的智能分拣、库存的动态预测、以及拣货路径的实时优化,从而显著提升仓储作业效率,降低运营成本,并为未来智慧供应链的建设提供关键技术支撑。', '科研管理部', 50, 10000000, '中科院', 10, 80, '郑强', 0, 1772380, '', '/2026/0302/demo/2936_3486.png', 204);
SET FOREIGN_KEY_CHECKS = 1;

View File

@ -11,7 +11,7 @@
Target Server Version : 100510
File Encoding : 65001
Date: 30/01/2026 00:44:12
Date: 28/02/2026 18:27:04
*/
SET NAMES utf8mb4;
@ -24,7 +24,7 @@ DROP TABLE IF EXISTS `lab_user`;
CREATE TABLE `lab_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '成员id',
`laborgid` bigint(20) NOT NULL COMMENT '所属机构,DB,lab_orgbase',
`icon` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '头像,IMG1',
`icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '头像,IMG1',
`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',
@ -42,24 +42,59 @@ CREATE TABLE `lab_user` (
`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',
`deletetimes` int(11) NULL DEFAULT NULL COMMENT '逻辑删除时间(时间戳)',
`ip` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '#登录IP,IP',
`role` int(11) NOT NULL COMMENT '成员状态:负责人,科研秘书,在册成员,外部人员,历史人员',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '实验室成员' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 106 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '实验室成员' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of lab_user
-- ----------------------------
INSERT INTO `lab_user` VALUES (14, 1, '/lab/lab.png', '张三', 10, 70, 'LAB-2024-001', 20, 1700000000000, '13800138001', 'zhangsan@lab.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 30, 0, 120, 0, 1710000000000, '', 0, NULL, '192.168.1.101', 60);
INSERT INTO `lab_user` VALUES (15, 1, '/lab/lab.png', '李四', 50, 50, 'LAB-2024-002', 20, 1702000000000, '13900139002', 'lisi@lab.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 20, 0, 86, 11, 1769417475, '', 0, NULL, '192.168.1.102', 60);
INSERT INTO `lab_user` VALUES (16, 2, '/lab/lab.png', '王五', 80, 60, 'LAB-2024-003', 20, 1704000000000, '13700137003', 'wangwu@lab.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 45, 2, 1712000000000, '', 0, NULL, '192.168.1.103', 60);
INSERT INTO `lab_user` VALUES (17, 1, '/lab/lab.png', '赵六', 20, 60, 'LAB-2024-004', 10, 1706000000000, '13600136004', 'zhaoliu@lab.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 20, 0, 98, 0, 1713000000000, '', 0, NULL, '192.168.1.104', 60);
INSERT INTO `lab_user` VALUES (19, 0, '/lab/lab.png', ':3780', 0, 0, '', 90, 1769439652, '18248103780', '', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1769696223, '7ohbWCmO87', 1769703976, NULL, '127.0.0.1', 60);
INSERT INTO `lab_user` VALUES (20, 0, '/lab/lab.png', ':0022', 0, 0, '', 90, 1769445509, '13654880022', '', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1769448199, 'p43i428v1j', 1769451799, NULL, '127.0.0.1', 60);
INSERT INTO `lab_user` VALUES (21, 0, '/lab/lab.png', ':0023', 0, 0, '', 90, 1769529209, '13654880023', '', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1769529209, 'FuBzvhAHI5', 1769532809, NULL, '127.0.0.1', 60);
INSERT INTO `lab_user` VALUES (22, 0, '/lab/lab.png', ':3788', 0, 0, '', 90, 1769671931, '18248103788', '', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1769672290, 'GjXvuqnEoM', 1769675890, NULL, '127.0.0.1', 60);
INSERT INTO `lab_user` VALUES (23, 0, '/lab/lab.png', ':3789', 0, 0, '', 90, 1769672770, '18248103789', '', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1769674212, 'i49npHbGlL', 1769677812, NULL, '127.0.0.1', 60);
INSERT INTO `lab_user` VALUES (24, 0, '/lab/lab.png', ':0024', 0, 0, '', 90, 1769676173, '13654880024', '', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1769676173, '1ZPWhJNtkd', 1769679773, NULL, '127.0.0.1', 60);
INSERT INTO `lab_user` VALUES (15, 1, '/lab/lab.png', '李四', 50, 50, 'LAB-2024-002', 20, 1702000000000, '13900139002', 'lisi@lab.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 20, 0, 86, 11, 1769417475, '', 0, '192.168.1.102', 40);
INSERT INTO `lab_user` VALUES (17, 1, '/2026/0205/demo/03118_8150.jpg', '赵佳', 20, 60, 'LAB-2024-004', 10, 1706000000000, '13600136004', 'zhaoliu@lab.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 20, 0, 98, 0, 1713000000000, '', 0, '192.168.1.104', 20);
INSERT INTO `lab_user` VALUES (19, 0, '/lab/lab.png', '小刘', 10, 0, '', 90, 1769439652, '18248103780', '', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1772270268, 'mho92a6DSp', 1772299068, '127.0.0.1', 20);
INSERT INTO `lab_user` VALUES (20, 0, '/lab/lab.png', '任小军', 30, 0, '', 90, 1769445509, '13654880026', '', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1769448199, 'p43i428v1j', 1769451799, '127.0.0.1', 60);
INSERT INTO `lab_user` VALUES (21, 0, '/lab/lab.png', '小美', 20, 0, '', 90, 1769529209, '13654880023', '', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1769529209, 'FuBzvhAHI5', 1769532809, '127.0.0.1', 60);
INSERT INTO `lab_user` VALUES (22, 0, '/lab/lab.png', '小韩', 30, 0, '', 90, 1769671931, '18248103788', '', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1769672290, 'GjXvuqnEoM', 1769675890, '127.0.0.1', 60);
INSERT INTO `lab_user` VALUES (33, 0, '/2026/0131/demo/01150_4151.png', '刘雪妍', 20, 50, '0909', 20, 1736352, '18248108896', '2736@qq.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1769789579, '', 0, '127.0.0.1', 20);
INSERT INTO `lab_user` VALUES (35, 0, '/2026/0131/demo/2200_3207.png', 'renyuxin', 10, 50, '12345', 20, 1767283, '13514713799', '27367559@qq.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 1, 1769868084, '', 0, '127.0.0.1', 20);
INSERT INTO `lab_user` VALUES (36, 0, '/2026/0131/demo/221321_6381.png', '小红', 40, 0, '', 90, 1769868122, '18345657899', '', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1769868122, 'WvZC6fdwBp', 1769896922, '127.0.0.1', 60);
INSERT INTO `lab_user` VALUES (37, 0, '/2026/0131/demo/221321_6381.png', '小沙', 30, 50, '1122', 20, 1767283, '15784559899', '2323@qq.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1769868887, 'msgtMJLFHb', 1769897687, '127.0.0.1', 20);
INSERT INTO `lab_user` VALUES (38, 0, '/2026/0205/demo/05710_4043.jpg', '大红', 10, 50, '909', 90, 1770220, '13654889565', '5689@qq.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1770300814, '5lLpUxkeoc', 1770329614, '127.0.0.1', 30);
INSERT INTO `lab_user` VALUES (39, 0, '/2026/0209/demo/11347_1380.png', '赵佳佳', 10, 50, '4569', 20, 1770566, '15689897878', '2456@qq.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1770570858, '', 0, '127.0.0.1', 40);
INSERT INTO `lab_user` VALUES (40, 0, '/2026/0210/demo/233245_1589.jpg', '白菊', 10, 50, '0717', 20, 1770652, '18548759656', '6369@qq.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 10, 1770801860, '', 0, '127.0.0.1', 20);
INSERT INTO `lab_user` VALUES (41, 0, '/2026/0211/demo/172844_7127.jpg', '塔拉', 30, 50, '79555', 20, 1770739, '13654888888', '56@qq.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 1, 1770802440, '', 0, '127.0.0.1', 30);
INSERT INTO `lab_user` VALUES (44, 0, '/2026/0211/demo/174110_4110.jpg', '叶谦', 40, 50, '122222', 20, 1770739, '13654880096', '273699@qq.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1770802998, 'CQTeW1qPff', 1770831798, '127.0.0.1', 20);
INSERT INTO `lab_user` VALUES (45, 0, '/2026/0211/demo/192328_6855.jpg', '小玉玉', 10, 50, '12222222', 20, 1770307, '15896564545', '123456@qq.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 10, 10, 0, 0, 0, 1770809043, '', 0, '127.0.0.1', 20);
INSERT INTO `lab_user` VALUES (76, 1, '/lab/lab.png', '陈伟', 10, 10204, 'LAB-2025-001', 1000, 1705248000000, '13812345678', 'chenwei@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 150, 0, 1770817060000, '', 0, '127.0.0.1', 10);
INSERT INTO `lab_user` VALUES (77, 1, '/lab/lab.png', '林芳', 10, 10205, 'LAB-2025-002', 1001, 1708358400000, '13987654321', 'linfang@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 120, 0, 1770817060000, '', 0, '127.0.0.1', 10);
INSERT INTO `lab_user` VALUES (78, 1, '/lab/lab.png', '周杰', 10, 10206, 'LAB-2025-003', 1000, 1710000000000, '13611111111', 'zhoujie@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 200, 0, 1770817060000, '', 0, '127.0.0.1', 10);
INSERT INTO `lab_user` VALUES (79, 1, '/lab/lab.png', '吴敏', 10, 10204, 'LAB-2025-004', 1001, 1712246400000, '13722222222', 'wumin@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 180, 0, 1770817060000, '', 0, '127.0.0.1', 10);
INSERT INTO `lab_user` VALUES (80, 1, '/lab/lab.png', '郑强', 10, 10203, 'LAB-2025-005', 1000, 1715443200000, '13533333333', 'zhengqiang@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 160, 0, 1770817060000, '', 0, '127.0.0.1', 10);
INSERT INTO `lab_user` VALUES (81, 1, '/lab/lab.png', '王丽', 20, 10205, 'LAB-2025-006', 1001, 1705507200000, '13844444444', 'wangli@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 20, 0, 90, 0, 1770817060000, '', 0, '127.0.0.1', 20);
INSERT INTO `lab_user` VALUES (82, 1, '/lab/lab.png', '李娜', 20, 10204, 'LAB-2025-007', 1001, 1708531200000, '13955555555', 'lina@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 20, 0, 85, 0, 1770817060000, '', 0, '127.0.0.1', 20);
INSERT INTO `lab_user` VALUES (83, 1, '/lab/lab.png', '张伟', 20, 10206, 'LAB-2025-008', 1000, 1711296000000, '13666666666', 'zhangwei@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 20, 0, 110, 0, 1770817060000, '', 0, '127.0.0.1', 20);
INSERT INTO `lab_user` VALUES (84, 1, '/lab/lab.png', '赵静', 20, 10203, 'LAB-2025-009', 1001, 1712678400000, '13777777777', 'zhaojing@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 20, 0, 75, 0, 1770817060000, '', 0, '127.0.0.1', 20);
INSERT INTO `lab_user` VALUES (85, 1, '/lab/lab.png', '孙浩', 20, 10205, 'LAB-2025-010', 1000, 1715702400000, '13588888888', 'sunhao@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 20, 0, 95, 0, 1770817060000, '', 0, '127.0.0.1', 20);
INSERT INTO `lab_user` VALUES (86, 1, '/lab/lab.png', '马超', 30, 10204, 'LAB-2025-011', 1000, 1705680000000, '13899999999', 'machao@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 60, 0, 1770817060000, '', 0, '127.0.0.1', 30);
INSERT INTO `lab_user` VALUES (87, 1, '/lab/lab.png', '黄忠', 30, 10205, 'LAB-2025-012', 1000, 1709049600000, '13900000000', 'huangzhong@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 55, 0, 1770817060000, '', 0, '127.0.0.1', 30);
INSERT INTO `lab_user` VALUES (88, 1, '/lab/lab.png', '许褚', 30, 10203, 'LAB-2025-013', 1000, 1711728000000, '13611111112', 'xuchu@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 70, 0, 1770817060000, '', 0, '127.0.0.1', 30);
INSERT INTO `lab_user` VALUES (89, 1, '/lab/lab.png', '典韦', 30, 10206, 'LAB-2025-014', 1000, 1713110400000, '13722222223', 'dianwei@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 80, 0, 1770817060000, '', 0, '127.0.0.1', 30);
INSERT INTO `lab_user` VALUES (90, 1, '/lab/lab.png', '张辽', 30, 10204, 'LAB-2025-015', 1000, 1716134400000, '13533333334', 'zhangliao@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 65, 0, 1770817060000, '', 0, '127.0.0.1', 30);
INSERT INTO `lab_user` VALUES (91, 1, '/lab/lab.png', '徐晃', 30, 10205, 'LAB-2025-016', 1000, 1717171200000, '13844444445', 'xuhuang@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 75, 0, 1770817060000, '', 0, '127.0.0.1', 30);
INSERT INTO `lab_user` VALUES (92, 1, '/lab/lab.png', '庞德', 30, 10203, 'LAB-2025-017', 1000, 1718380800000, '13955555556', 'pangde@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 50, 0, 1770817060000, '', 0, '127.0.0.1', 30);
INSERT INTO `lab_user` VALUES (93, 1, '/lab/lab.png', '张郃', 30, 10206, 'LAB-2025-018', 1000, 1719763200000, '13666666667', 'zhanghe@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 85, 0, 1770817060000, '', 0, '127.0.0.1', 30);
INSERT INTO `lab_user` VALUES (94, 1, '/lab/lab.png', '高顺', 30, 10204, 'LAB-2025-019', 1000, 1720540800000, '13777777778', 'gaoshun@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 45, 0, 1770817060000, '', 0, '127.0.0.1', 30);
INSERT INTO `lab_user` VALUES (95, 1, '/lab/lab.png', '韩当', 30, 10205, 'LAB-2025-020', 1000, 1721404800000, '13588888889', 'handang@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 90, 0, 1770817060000, '', 0, '127.0.0.1', 30);
INSERT INTO `lab_user` VALUES (96, 1, '/lab/lab.png', '朱然', 10, 10204, 'LAB-2023-001', 1000, 1673280000000, '13899999990', 'zhuran@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 30, 0, 1770817060000, '', 0, '127.0.0.1', 40);
INSERT INTO `lab_user` VALUES (97, 1, '/lab/lab.png', '潘璋', 10, 10203, 'LAB-2023-002', 1000, 1676390400000, '13900000001', 'panzhang@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 25, 0, 1770817060000, '', 0, '127.0.0.1', 40);
INSERT INTO `lab_user` VALUES (98, 1, '/lab/lab.png', '丁奉', 10, 10205, 'LAB-2023-003', 1000, 1679241600000, '13611111113', 'dingfeng@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 40, 0, 1770817060000, '', 0, '127.0.0.1', 40);
INSERT INTO `lab_user` VALUES (99, 1, '/lab/lab.png', '凌统', 10, 10204, 'LAB-2023-004', 1000, 1682352000000, '13722222224', 'lingtong@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 35, 0, 1770817060000, '', 0, '127.0.0.1', 40);
INSERT INTO `lab_user` VALUES (100, 1, '/lab/lab.png', '蒋钦', 10, 10206, 'LAB-2023-005', 1000, 1685376000000, '13533333335', 'jiangqin@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 45, 0, 1770817060000, '', 0, '127.0.0.1', 40);
INSERT INTO `lab_user` VALUES (101, 1, '/lab/lab.png', '甘宁', 10, 10204, 'EXT-2025-001', 1000, 1736006400000, '13844444446', 'anning@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 20, 0, 1770817060000, '', 0, '127.0.0.1', 50);
INSERT INTO `lab_user` VALUES (102, 1, '/lab/lab.png', '太史慈', 10, 10205, 'EXT-2025-002', 1000, 1739116800000, '13955555557', 'taishici@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 22, 0, 1770817060000, '', 0, '127.0.0.1', 50);
INSERT INTO `lab_user` VALUES (103, 1, '/lab/lab.png', '程普', 10, 10203, 'EXT-2025-003', 1000, 1741968000000, '13666666668', 'chengpu@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 18, 0, 1770817060000, '', 0, '127.0.0.1', 50);
INSERT INTO `lab_user` VALUES (104, 1, '/lab/lab.png', '黄盖', 10, 10206, 'EXT-2025-004', 1000, 1745078400000, '13777777779', 'huanggai@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 25, 0, 1770817060000, '', 0, '127.0.0.1', 50);
INSERT INTO `lab_user` VALUES (105, 1, '/lab/lab.png', '韩浩', 10, 10204, 'EXT-2025-005', 1000, 1748102400000, '13588888890', 'hanhao@example.com', 'd527d1bf5fe6a4361f230af48e36e1c4', 1012, 10, 0, 15, 0, 1770817060000, '', 0, '127.0.0.1', 50);
SET FOREIGN_KEY_CHECKS = 1;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 MiB

View File

@ -1,51 +1,285 @@
<?php
namespace web\ambap;
class adduser {
public static function json_add() {
$db = new \ciy\db();
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('lab_user');
if (isset($query['name']) && !empty(trim($query['name']))) {
$csql->where('name like', trim($query['name']));
}
if (isset($query['usertitle']) && $query['usertitle'] > 0) {
$csql->where('usertitle', $query['usertitle']);
}
if (isset($query['role']) && $query['role'] > 0) {
$csql->where('role', $query['role']);
}
$liid =$post->getint('liid',0);
if ($liid > 0) {
$csql->where('role', $liid);
}
$csql->order('addtimes DESC');
return [$query, $csql];
}
public static function json_list() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post);
$pageno = $post->getint('pageno', 1);
$pagecount = $post->getint('pagecount', 10);
$csql->limit($pageno, $pagecount);
try {
$total = -1;
$rows = $db->get($csql, $total);
$ret = [
'searchwhere' => $where,
'pageno' => $pageno,
'pagecount' => $pagecount,
'count' => $total,
'list' => $rows
];
if ($post->getbool('once')) {
$ret['once'] = true;
$ret['lis'] = getcatas($db, 'role');
$input = [];
$input[] = [
'type' => 'input',
'form' => 'name',
'name' => '成员姓名',
'prop' => ' style="width:8em;"'
];
$input[] = [
'type' => 'select',
'form' => 'usertitle',
'name' => '头衔',
'select' => 'usertitle',
'all' => '全部'
];
$input[] = [
'type' => 'select',
'form' => 'role',
'name' => '状态',
'select' => 'role',
'all' => '全部'
];
$ret['searchinput'] = $input;
}
$ret['usertitle'] = getcatas($db, 'usertitle');
$ret['role'] = getcatas($db, 'role');
return succjson($ret);
} catch (\Exception $e) {
return errjson('查询列表失败:' . $e->getMessage());
}
}
public static function json_info() {
global $db;
$post = new \ciy\post();
$id = $post->getint('id');
if ($id <= 0) {
return errjson('请传入有效的成员ID');
}
$csql = new \ciy\sql('lab_user');
$csql->where('id', $id);
$row = $db->getone($csql);
if (!is_array($row)) {
return errjson('实验室成员数据不存在');
}
return succjson(['data' => $row]);
}
public static function json_add() {
global $db;
$post = new \ciy\post();
$laborgid = $post->getint('laborgid', 0);
$stpstatus = 10;
$userlevel=10;
$dvotecnt=0;
$exptimes = 2147483647;
$name = $post->get('name');
$addtimes = $post->getint('addtimes');
$addtimesText = $post->get('addtimesText');
$icon = $post->get('icon', '');
$usertitle = $post->getint('usertitle', 0);
$role = $post->getint('role', 30);
$education = $post->getint('education', 50);
$sn = $post->get('sn', '');
$sex = $post->getint('sex', 90);
$addtimes = $post->getint('addtimes');
$mobile = $post->get('mobile', '');
$email = $post->get('email', '');
$password = $post->get('password', '1');
$pass = $post->get('pass');
if (empty($pass)) {
return errjson('请设置初始密码');
}
if (empty($name)) {
return errjson('请填写成员姓名');
}
if (empty($addtimes) || !is_numeric($addtimes)) {
return errjson('请选择有效的加入日期');
if (empty($sn)) {
return errjson('请填写成员编号');
}
$csqlSn = new \ciy\sql('lab_user');
$csqlSn->where('sn', $sn);
$snExist = $db->getone($csqlSn);
if ($snExist) {
return errjson('成员编号已存在,请更换');
}
if (!empty($mobile)) {
if (!preg_match('/^1[3-9]\d{9}$/', $mobile)) {
return errjson('请输入有效的11位手机号');
}
$csqlMobile = new \ciy\sql('lab_user');
$csqlMobile->where('mobile', $mobile);
$mobileExist = $db->getone($csqlMobile);
if ($mobileExist) {
return errjson('该手机号已绑定其他成员,请更换');
}
}
if (!empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
return errjson('请输入有效的邮箱地址');
}
$addtimes = intval($addtimes / 1000);
if ($addtimes <= 0) {
return errjson('加入日期转换失败,请重新选择');
}
$insertData = [
'laborgid' => $laborgid,
'stpstatus'=>$stpstatus,
'userlevel'=>$userlevel,
'stpstatus' => 10,
'userlevel' => 10,
'name' => $name,
'dvotecnt'=>$dvotecnt,
'dvotecnt' => 0,
'exptimes' => 0,
'icon' => $icon,
'usertitle' => $usertitle,
'role' => $role,
'education' => $education,
'sn' => $sn,
'sex' => $sex,
'addtimes' => $addtimes,
'mobile' => $mobile,
'email' => $email,
'password' => $pass,
'trytime' => 0,
'logintimes' => time(),
'ip' => getip()
];
try {
$csql = new \ciy\sql('lab_user');
$insertResult = $db->insert($csql, $insertData);
if ($insertResult === false) {
return errjson('新增成员失败:' . $db->error);
}
$newMemberId = $db->insert_id();
$successData = ['id' => $newMemberId, 'name' => $name];
return succjson($successData);
} catch (\Exception $e) {
return errjson('新增成员失败:' . $e->getMessage());
}
}
public static function json_update() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('id');
if ($id <= 0) {
return errjson('请传入有效的成员ID');
}
$csql = new \ciy\sql('lab_user');
$csql->where('id', $id);
$datarow = $db->getone($csql);
if (!is_array($datarow)) {
return errjson('实验室成员数据不存在');
}
$name = $post->get('name');
$icon = $post->get('icon', '');
$usertitle = $post->getint('usertitle', $datarow['usertitle']);
$role = $post->getint('role', $datarow['role']);
$education = $post->getint('education', 50);
$sn = $post->get('sn', '');
$sex = $post->getint('sex', 90);
$addtimes = $post->getint('addtimes');
$mobile = $post->get('mobile', '');
$email = $post->get('email', '');
$pass = $post->get('pass', '');
$stpstatus = $post->getint('stpstatus', 10);
$userlevel = $post->getint('userlevel', 10);
$dvotecnt = $post->getint('dvotecnt', 0);
$exptimes = $post->getint('exptimes', 0);
if (empty($name)) {
return errjson('请填写成员姓名');
}
if (!empty($sn) && $sn != $datarow['sn']) {
$csqlSn = new \ciy\sql('lab_user');
$csqlSn->where('sn', $sn);
$csqlSn->where('id !=', $id);
$snExist = $db->getone($csqlSn);
if ($snExist) {
return errjson('成员编号已存在,请更换');
}
} else {
$sn = $datarow['sn'];
}
if (!empty($mobile) && $mobile != $datarow['mobile']) {
if (!preg_match('/^1[3-9]\d{9}$/', $mobile)) {
return errjson('请输入有效的11位手机号');
}
$csqlMobile = new \ciy\sql('lab_user');
$csqlMobile->where('mobile', $mobile);
$csqlMobile->where('id !=', $id);
$mobileExist = $db->getone($csqlMobile);
if ($mobileExist) {
return errjson('该手机号已绑定其他成员,请更换');
}
} else {
$mobile = $datarow['mobile'];
}
if (!empty($email) && $email != $datarow['email']) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return errjson('请输入有效的邮箱地址');
}
} else {
$email = $datarow['email'];
}
if (!empty($addtimes)) {
$addtimes = intval($addtimes / 1000);
if ($addtimes <= 0) {
return errjson('加入日期转换失败,请重新选择');
}
} else {
$addtimes = $datarow['addtimes'];
}
$updata = [
'laborgid' => $post->getint('laborgid', 0),
'stpstatus' => $stpstatus,
'userlevel' => $userlevel,
'name' => $name,
'dvotecnt' => $dvotecnt,
'exptimes' => $exptimes,
'icon' => $icon,
'usertitle' => $usertitle,
@ -56,28 +290,61 @@ class adduser {
'addtimes' => $addtimes,
'mobile' => $mobile,
'email' => $email,
'password' => md5($password),
'trytime' => 0,
'logintimes' => tostamp(),
'ip' => getip()
'trytime' => $datarow['trytime'],
'logintimes' => $datarow['logintimes'],
'ip' => $datarow['ip']
];
try {
$csql = new \ciy\sql('lab_user');
$insertResult = $db->insert($csql, $insertData);
if ($insertResult === false) {
return errjson('新增成员失败:' . $db->error);
}
$newMemberId = $db->insert_id();
$successData = [
'id' => $newMemberId,
'name' => $name
];
return succjson($successData);
} catch (\Exception $e) {
return errjson('新增成员失败:' . $e->getMessage());
if (!empty($pass)) {
$updata['password'] = $pass;
}
try {
$db->begin();
$csqlUpdate = new \ciy\sql('lab_user');
$csqlUpdate->where('id', $id);
$updateResult = $db->update($csqlUpdate, $updata);
if ($updateResult === false) {
throw new \Exception('更新成员失败:' . $db->error);
}
savelogdb($db, $rsuser['id'], 'lab_user', $datarow, $updata);
$db->commit();
$csqlNew = new \ciy\sql('lab_user');
$csqlNew->where('id', $id);
$newData = $db->getone($csqlNew);
return succjson(['data' => $newData]);
} catch (\Exception $e) {
$db->rollback();
return errjson('更新成员失败:' . $e->getMessage());
}
}
public static function json_del() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('id');
$csql = new \ciy\sql('lab_user');
$csql->where('id', $id);
$row = $db->getone($csql);
if (!is_array($row))
return errjson('实验室成员数据不存在');
try {
$db->begin();
$delid = $row['id'];
delme($db, $delid, 'lab_user');
savelogdb($db, $rsuser['id'], 'lab_user', $row, null);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
return errjson($ex->getMessage());
}
return succjson();
}
}
adduser::json_add();
?>

View File

@ -18,7 +18,7 @@
*/
$_token = array();
$_token['type'] = 'localstorage'; //cookie(更安全) 、 localstorage(兼容性好) 微信小程序不支持cookie
$_token['swapsec'] = 3600; //更换JWT时间
$_token['swapsec'] = 28800; //更换JWT时间
$_token['expsec'] = 86400; //过期退出时间
$_token['field'] = 'ciyap';
$_token['salt'] = 'ast34h$3'; //做数据加解密时的加密因子,每个项目都不要相同。

View File

@ -258,12 +258,6 @@ class me {
if (ismail($email))
return errjson('邮箱格式不正确');
}
$bad = \web\api\thirdapi::checkbadword_wx($name, $rsuser);
if (is_string($bad))
return errjson('昵称' . $bad);
$bad = \web\api\thirdapi::checkbadmedia_wx(file_stor($icon), $rsuser, 2);
if (is_string($bad))
return errjson('头像' . $bad);
try {
$db->begin();
$updata = array();

578
web/ambap/project.php Normal file
View File

@ -0,0 +1,578 @@
<?php
namespace web\ambap;
global $db;
class Project {
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('lab_rproject');
if (isset($query['name']) && !empty(trim($query['name']))) {
$csql->where('name LIKE ?', '%' . trim($query['name']) . '%');
}
if (isset($query['rcate']) && $query['rcate'] > 0) {
$csql->where('rcate = ?', $query['rcate']);
}
if (isset($query['rprojectstatus']) && $query['rprojectstatus'] > 0) {
$csql->where('rprojectstatus = ?', $query['rprojectstatus']);
}
if (isset($query['direction']) && $query['direction'] > 0) {
$csql->where('direction = ?', $query['direction']);
}
$liid = $post->getint('liid', 0);
if ($liid > 0) {
$csql->where('rcate = ?', $liid);
}
$csql->order('recordtime DESC');
return [$query, $csql];
}
public static function json_list() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post);
$pageno = $post->getint('pageno', 1);
$pagecount = $post->getint('pagecount', 10);
try {
$countSqlObj = new \ciy\sql($csql->table);
$countSqlObj->column('COUNT(*) as cnt');
$countSqlObj->where($csql->where, $csql->tsmt);
$countSqlObj->order('');
$countSqlObj->selecttail('');
$countResult = $db->getone($countSqlObj);
$total = $countResult['cnt'];
$listSql = new \ciy\sql('lab_rproject p');
$listSql->column('p.*, (
SELECT GROUP_CONCAT(u.name SEPARATOR ", ")
FROM lab_projectmember pm_sub
LEFT JOIN lab_user u ON pm_sub.uid = u.id
WHERE pm_sub.pid = p.id
) AS member_names');
//$listSql->column('p.*');
$listSql->where($csql->where, $csql->tsmt);
//$listSql->selecttail('LEFT JOIN lab_projectmember pm ON p.id = pm.pid');
//$listSql->selecttail('LEFT JOIN lab_user u ON pm.uid = u.id');
//$listSql->selecttail('GROUP BY p.id');
$listSql->order($csql->order);
$listSql->limit($pageno, $pagecount);
$rows = $db->get($listSql);
// --- 修复:确保 $rows 是一个数组 ---
if ($rows === false) {
$rows = [];
}
$list_count = count($rows);
$ret = [
'searchwhere' => $where,
'pageno' => $pageno,
'pagecount' => $pagecount,
'count' => $total,
'list' => $rows
];
$ret['debug_console'] = [
'raw_db_count' => $total,
'raw_db_list_count' => $list_count,
'sql_where_clause' => $csql->where,
'sql_params' => $csql->tsmt,
'sql_order_clause' => $csql->order,
];
if ($post->getbool('once')) {
$ret['once'] = true;
$ret['lis'] = getcatas($db, 'rcate');
$input = [];
$input[] = [
'type' => 'input',
'form' => 'name',
'name' => '课题标题',
'prop' => ' style="width:10em;"'
];
$input[] = [
'type' => 'select',
'form' => 'rprojectstatus',
'name' => '项目状态',
'select' => 'rprojectstatus',
'all' => '全部'
];
$ret['searchinput'] = $input;
}
$orgSql = new \ciy\sql('lab_orgbase');
$orgList = $db->get(csql: $orgSql);
$ret['laborg'] = $orgList ?: [];
return succjson($ret);
} catch (\Exception $e) {
return errjson('查询列表失败:' . $e->getMessage());
}
}
public static function json_addinit() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('id');
if ($post->get('act') == 'edit') {
$userSql = new \ciy\sql('lab_user');
$userList = $db->get($userSql);
$ret['users'] = $userList ?: [];
$orgSql = new \ciy\sql('lab_orgbase');
$orgList = $db->get($orgSql);
$ret['orgs'] = $orgList ?: [];
$memberSql = new \ciy\sql('lab_projectmember m');
$memberSql->column('m.id as mid, m.pid, m.uid, u.name AS uname, m.prole, m.ctime, m.utime')
->where('m.pid = ?', $id)
->selecttail('LEFT JOIN lab_user u ON m.uid = u.id');
$members = $db->get($memberSql);
$ret['members'] = $members ?: [];
$ret['rcate'] = getcatas($db, 'rcate');
$ret['rprojectstatus'] = getcatas($db, 'rprojectstatus');
$ret['direction'] = getcatas($db, 'direction');
$ret['isweb'] = getcatas($db, 'isweb');
$ret['mdeptlevel'] = getcatas($db, 'mdeptlevel');
$ret['prole'] = getcatas($db, 'prole');
$ret['principal_id']=getcatas($db,'principal_id');
}
return succjson($ret);
}
public static function json_info() {
global $db;
$post = new \ciy\post();
$id = $post->getint('id');
if ($id <= 0) {
return errjson('请传入有效的项目ID');
}
$csql = new \ciy\sql('lab_rproject');
$csql->where('id = ?', $id);
$row = $db->getone($csql);
if (!is_array($row)) {
return errjson('项目数据不存在');
}
$ret['data'] = $row;
$userSql = new \ciy\sql('lab_user');
$userList = $db->get($userSql);
$ret['users'] = $userList ?: [];
$orgSql = new \ciy\sql('lab_orgbase');
$orgList = $db->get($orgSql);
$ret['orgs'] = $orgList ?: [];
// --- 修改后的代码:使用 getraw 执行原始 SQL ---
$members = $db->getraw(
"SELECT m.id as mid, m.pid, m.uid, u.name as uname, m.prole, m.ctime, m.utime
FROM lab_projectmember m
LEFT JOIN lab_user u ON m.uid = u.id
WHERE m.pid = ?",
[$id]
);
// 将结果赋值给 $ret 数组
$ret['members'] = $members ?: [];
// --- 修改结束 ---
$ret['rcate'] = getcatas($db, 'rcate');
$ret['rprojectstatus'] = getcatas($db, 'rprojectstatus');
$ret['direction'] = getcatas($db, 'direction');
$ret['isweb'] = getcatas($db, 'isweb');
$ret['mdeptlevel'] = getcatas($db, 'mdeptlevel');
$ret['prole'] = getcatas($db, 'prole');
return succjson($ret);
}
public static function json_add() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$recordno = $post->get('recordno');
$laborgid = $post->getint('laborgid', 0);
$isweb = $post->getint('isweb', 0);
$rcate = $post->getint('rcate', 0);
$name = $post->get('name');
$descs = $post->get('descs');
$mdeptname = $post->get('mdeptname');
$mdeptlevel = $post->getint('mdeptlevel', 0);
$budgetmoney = $post->getint('budgetmoney', 0);
$serviceorg = $post->get('serviceorg');
$principal_id = $post->getint('principal_id', 0);
$rprojectstatus = $post->getint('rprojectstatus', 0);
$progress = $post->getint('progress', 0);
$lasttimes = $post->getint('lasttimes', 0);
$latestcontent = $post->get('latestcontent');
$latestattachment = $post->get('latestattachment');
$direction = $post->getint('direction', 0);
if (empty($name)) {
return errjson('课题标题不能为空');
}
if (empty($recordno)) {
return errjson('备案编号不能为空');
}
if ($laborgid > 0) {
$checkOrgSql = new \ciy\sql('lab_orgbase');
$checkOrgSql->where('id = ?', $laborgid);
if (!$db->getone($checkOrgSql)) {
return errjson('所选机构不存在');
}
}
if ($principal_id > 0) {
$checkUserSql = new \ciy\sql('lab_user');
$checkUserSql->where('id = ?', $principal_id);
if (!$db->getone($checkUserSql)) {
return errjson('所选负责人不存在');
}
}
$currentTime = time();
$insertData = [
'recordtime' => $currentTime,
'recordno' => $recordno,
'laborgid' => $laborgid,
'orgname' => '',
'isweb' => $isweb,
'rcate' => $rcate,
'name' => $name,
'descs' => $descs,
'mdeptname' => $mdeptname,
'mdeptlevel' => $mdeptlevel,
'budgetmoney' => $budgetmoney,
'serviceorg' => $serviceorg,
'principal_id' => $principal_id,
'principal_name' => '',
'rprojectstatus' => $rprojectstatus,
'progress' => $progress,
'lasttimes' => $lasttimes,
'latestcontent' => $latestcontent,
'latestattachment' => $latestattachment,
'direction' => $direction
];
try {
$db->begin();
$projectSql = new \ciy\sql('lab_rproject');
if ($db->insert($projectSql, $insertData) === false) {
throw new \Exception('新增项目失败: ' . $db->error);
}
$projectId = $db->insert_id();
if ($laborgid > 0) {
$orgSql = new \ciy\sql('lab_orgbase');
$orgSql->where('id = ?', $laborgid);
$orgInfo = $db->getone($orgSql);
if ($orgInfo) {
$updateOrgNameSql = new \ciy\sql('lab_rproject');
$updateOrgNameSql->where('id = ?', $projectId);
$db->update($updateOrgNameSql, [
'orgname' => $orgInfo['name'],
'orgshortname' => $orgInfo['shortname'] ?? $orgInfo['name']
]);
}
}
if ($principal_id > 0) {
$userSql = new \ciy\sql('lab_user');
$userSql->where('id = ?', $principal_id);
$userInfo = $db->getone($userSql);
if ($userInfo) {
$updatePrincipalNameSql = new \ciy\sql('lab_rproject');
$updatePrincipalNameSql->where('id = ?', $projectId);
$db->update($updatePrincipalNameSql, [
'principal_name' => $userInfo['name']
]);
}
}
if ($principal_id > 0) {
$memberInsertData = [
'pid' => $projectId,
'uid' => $principal_id,
'prole' => 10,
'ctime' => $currentTime,
'utime' => $currentTime
];
$memberSql = new \ciy\sql('lab_projectmember');
if ($db->insert($memberSql, $memberInsertData) === false) {
throw new \Exception('添加项目负责人到成员列表失败: ' . $db->error);
}
}
$db->commit();
$insertData['id'] = $projectId;
savelogdb($db, $rsuser['id'], 'lab_rproject', null, $insertData);
return succjson(['id' => $projectId, 'name' => $name]);
} catch (\Exception $e) {
$db->rollback();
return errjson($e->getMessage());
}
}
public static function json_update() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('id');
if ($id <= 0) {
return errjson('请传入有效的项目ID');
}
$csql = new \ciy\sql('lab_rproject');
$csql->where('id = ?', $id);
$originalData = $db->getone($csql);
if (!is_array($originalData)) {
return errjson('项目数据不存在');
}
$recordno = $post->get('recordno');
$laborgid = $post->getint('laborgid', 0);
$isweb = $post->getint('isweb', 0);
$rcate = $post->getint('rcate', 0);
$name = $post->get('name');
$descs = $post->get('descs');
$mdeptname = $post->get('mdeptname');
$mdeptlevel = $post->getint('mdeptlevel', 0);
$budgetmoney = $post->getint('budgetmoney', 0);
$serviceorg = $post->get('serviceorg');
$principal_id = $post->getint('principal_id', 0);
$rprojectstatus = $post->getint('rprojectstatus', 0);
$progress = $post->getint('progress', 0);
$lasttimes = $post->getint('lasttimes', 0);
$latestcontent = $post->get('latestcontent');
$latestattachment = $post->get('latestattachment');
$direction = $post->getint('direction', 0);
$newMembers = $post->get('members', []);
if (empty($name)) {
return errjson('课题标题不能为空');
}
if (empty($recordno)) {
return errjson('备案编号不能为空');
}
if ($laborgid > 0) {
$checkOrgSql = new \ciy\sql('lab_orgbase');
$checkOrgSql->where('id = ?', $laborgid);
if (!$db->getone($checkOrgSql)) {
return errjson('所选机构不存在');
}
}
if ($principal_id > 0) {
$checkUserSql = new \ciy\sql('lab_user');
$checkUserSql->where('id', $principal_id);
if (!$db->getone($checkUserSql)) {
return errjson('所选负责人不存在');
}
}
$rawProleOptions = getcatas($db, 'prole');
$validProleIds = array_column($rawProleOptions, 'id');
foreach ($newMembers as $member) {
$prole = $member['prole'] ?? 10;
if (!in_array($prole, $validProleIds)) {
return errjson("成员角色ID无效: $prole");
}
}
$updateData = [
'recordno' => $recordno,
'laborgid' => $laborgid,
'isweb' => $isweb,
'rcate' => $rcate,
'name' => $name,
'descs' => $descs,
'mdeptname' => $mdeptname,
'mdeptlevel' => $mdeptlevel,
'budgetmoney' => $budgetmoney,
'serviceorg' => $serviceorg,
'principal_id' => $principal_id,
'rprojectstatus' => $rprojectstatus,
'progress' => $progress,
'lasttimes' => $lasttimes,
'latestcontent' => $latestcontent,
'latestattachment' => $latestattachment,
'direction' => $direction
];
if ($laborgid > 0) {
$orgSql = new \ciy\sql('lab_orgbase');
$orgSql->where('id = ?', $laborgid);
$orgInfo = $db->getone($orgSql);
if ($orgInfo) {
$updateData['orgname'] = $orgInfo['name'];
} else {
$updateData['orgname'] = null;
}
} else {
$updateData['orgname'] = null;
}
if ($principal_id > 0) {
$userSql = new \ciy\sql('lab_user');
$userSql->where('id = ?', $principal_id);
$userInfo = $db->getone($userSql);
if ($userInfo) {
$updateData['principal_name'] = $userInfo['name'];
} else {
$updateData['principal_name'] = null;
}
} else {
$updateData['principal_name'] = null;
}
try {
$db->begin();
$updateSql = new \ciy\sql('lab_rproject');
$updateSql->where('id = ?', $id);
if ($db->update($updateSql, $updateData) === false) {
throw new \Exception('更新项目基本信息失败: ' . $db->error);
}
if ($id > 0) {
$currentMemberSql = new \ciy\sql('lab_projectmember');
$currentMemberSql->where('pid = ?', $id);
foreach ($newMembers as $member) {
$mid = $member['mid'] ?? 0;
$uid = $member['uid'] ?? 0;
$prole = $member['prole'] ?? 10;
$isNew = $member['isNew'] ?? false;
$isDeleted = $member['isDeleted'] ?? false;
if ($isDeleted) {
if ($mid > 0) {
$delSql = new \ciy\sql('lab_projectmember');
$delSql->where('id = ?', $mid);
if ($db->delete($delSql) === false) {
throw new \Exception("删除成员失败 (ID: $mid): " . $db->error);
}
}
} elseif ($uid > 0) {
if ($isNew) {
// 对于新成员,先检查是否已存在 ---
$checkSql = new \ciy\sql('lab_projectmember');
$checkSql->where('pid = ? AND uid = ?', [$id, $uid]);
$existingRecord = $db->getone($checkSql);
if ($existingRecord) {
$updateMemberData = [
'prole' => $prole,
'utime' => time()
];
$updateSql = new \ciy\sql('lab_projectmember');
$updateSql->where('pid = ? AND uid = ?', [$id, $uid]);
if ($db->update($updateSql, $updateMemberData) === false) {
throw new \Exception("更新成员信息失败 (PID: $id, UID: $uid): " . $db->error);
}
$incomingMemberIds[] = $existingRecord['id'];
} else {
$insertMemberData = [
'pid' => $id,
'uid' => $uid,
'prole' => $prole,
'ctime' => time(),
'utime' => time()
];
$insertSql = new \ciy\sql('lab_projectmember');
if ($db->insert($insertSql, $insertMemberData) === false) {
throw new \Exception("添加新成员失败: " . $db->error);
}
$newlyInsertedId = $db->insert_id();
$incomingMemberIds[] = $newlyInsertedId;
}
} else {
if ($mid > 0) {
$updateMemberData = [
'uid' => $uid,
'prole' => $prole,
'utime' => time()
];
$updateSql = new \ciy\sql('lab_projectmember');
$updateSql->where('id = ?', $mid);
if ($db->update($updateSql, $updateMemberData) === false) {
throw new \Exception("更新成员信息失败 (ID: $mid): " . $db->error);
}
$incomingMemberIds[] = $mid;
}
}
}
}
}
$db->commit();
savelogdb($db, $rsuser['id'], 'lab_rproject', $originalData, $updateData);
$finalSql = new \ciy\sql('lab_rproject');
$finalSql->where('id = ?', $id);
$finalRow = $db->getone($finalSql);
return succjson(['data' => $finalRow]);
} catch (\Exception $e) {
$db->rollback();
return errjson($e->getMessage());
}
}
public static function json_del() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('id');
$csql = new \ciy\sql('lab_rproject');
$csql->where('id = ?', $id);
$row = $db->getone($csql);
if (!is_array($row)) {
return errjson('项目数据不存在');
}
try {
$db->begin();
$delMemberSql = new \ciy\sql('lab_projectmember');
$delMemberSql->where('pid = ?', $id);
if ($db->delete($delMemberSql) === false) {
throw new \Exception('删除项目成员关联失败:' . $db->error);
}
delme($db, $row['id'], 'lab_rproject');
savelogdb($db, $rsuser['id'], 'lab_rproject', $row, null);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
return errjson($ex->getMessage());
}
return succjson();
}
}
?>

View File

@ -11,7 +11,7 @@
Target Server Version : 100510
File Encoding : 65001
Date: 29/01/2026 19:33:39
Date: 01/03/2026 01:01:16
*/
SET NAMES utf8mb4;
@ -33,7 +33,7 @@ CREATE TABLE `zc_cata` (
`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 = 12001750 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 13001654 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of zc_cata
@ -146,5 +146,88 @@ 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', '未知', '', '');
INSERT INTO `zc_cata` VALUES (12001749, 0, 60, 1, 12001703, '60', '未知', 'weizhi', '');
INSERT INTO `zc_cata` VALUES (12001750, 0, 90, 1, 12001701, '0', '无头衔', '', '');
INSERT INTO `zc_cata` VALUES (13001100, 0, 10, 1, 13001312, '10', '顶级1', '', '');
INSERT INTO `zc_cata` VALUES (13001101, 0, 10, 1, 13001312, '20', '顶级2', '', '');
INSERT INTO `zc_cata` VALUES (13001312, 2, 10, 1, 0, 'treecode', '树形实验', '', '');
INSERT INTO `zc_cata` VALUES (13001313, 13001100, 101, 1, 13001312, '101', '下一级A', '', '');
INSERT INTO `zc_cata` VALUES (13001314, 13001100, 102, 1, 13001312, '102', '下一级B', '', '');
INSERT INTO `zc_cata` VALUES (13001315, 13001314, 1021, 1, 13001312, '1021', '下下级1', '', '');
INSERT INTO `zc_cata` VALUES (13001316, 13001314, 1022, 1, 13001312, '1022', '下下级2', '', '');
INSERT INTO `zc_cata` VALUES (13001317, 13001101, 201, 1, 13001312, '201', '下二级C', '', '');
INSERT INTO `zc_cata` VALUES (13001350, 0, 10, 1, 13001413, '10', '基础研究', '', '');
INSERT INTO `zc_cata` VALUES (13001351, 0, 10, 1, 13001413, '20', '应用研究', '', '');
INSERT INTO `zc_cata` VALUES (13001352, 0, 10, 1, 13001413, '30', '开发研究', '', '');
INSERT INTO `zc_cata` VALUES (13001353, 0, 10, 1, 13001413, '40', '软科学研究', '', '');
INSERT INTO `zc_cata` VALUES (13001354, 0, 10, 1, 13001413, '50', '技术服务业', '', '');
INSERT INTO `zc_cata` VALUES (13001400, 0, 10, 1, 13001414, '10', '立项中', '', '');
INSERT INTO `zc_cata` VALUES (13001401, 0, 10, 1, 13001414, '20', '在研', '', '');
INSERT INTO `zc_cata` VALUES (13001402, 0, 10, 1, 13001414, '30', '结题', '', '');
INSERT INTO `zc_cata` VALUES (13001403, 0, 10, 1, 13001414, '40', '终止', '', '');
INSERT INTO `zc_cata` VALUES (13001404, 0, 10, 1, 13001414, '50', '已撤销', '', '');
INSERT INTO `zc_cata` VALUES (13001413, 2, 10, 1, 0, 'rcate', '科研类目', '', 'lab_rproject.rcate');
INSERT INTO `zc_cata` VALUES (13001414, 2, 10, 1, 0, 'rprojectstatus', '项目状态', '', 'lab_rproject.rprojectstatus');
INSERT INTO `zc_cata` VALUES (13001415, 2, 10, 1, 0, 'mdeptlevel', '主管部门层级', '', 'lab_rproject.mdeptlevel');
INSERT INTO `zc_cata` VALUES (13001416, 2, 10, 1, 0, 'isweb', '公开属性', '', 'lab_rproject.isweb');
INSERT INTO `zc_cata` VALUES (13001417, 2, 10, 1, 0, 'direction', '备案方向', '', 'lab_rproject.direction');
INSERT INTO `zc_cata` VALUES (13001418, 2, 10, 1, 0, 'prole', '课题成员身份', '', 'lab_projectmember.prole');
INSERT INTO `zc_cata` VALUES (13001450, 0, 10, 1, 13001415, '10', '国家级', '', '');
INSERT INTO `zc_cata` VALUES (13001451, 0, 10, 1, 13001415, '20', '省部级', '', '');
INSERT INTO `zc_cata` VALUES (13001452, 0, 10, 1, 13001415, '30', '市厅级', '', '');
INSERT INTO `zc_cata` VALUES (13001453, 0, 10, 1, 13001415, '40', '校级', '', '');
INSERT INTO `zc_cata` VALUES (13001454, 0, 10, 1, 13001415, '50', '院级', '', '');
INSERT INTO `zc_cata` VALUES (13001500, 0, 10, 1, 13001416, '10', '公开', '', '');
INSERT INTO `zc_cata` VALUES (13001501, 0, 10, 1, 13001416, '20', '非公开', '', '');
INSERT INTO `zc_cata` VALUES (13001550, 0, 10, 1, 13001417, '10', '拟发论文', '', '');
INSERT INTO `zc_cata` VALUES (13001551, 0, 10, 1, 13001417, '20', '拟报课题', '', '');
INSERT INTO `zc_cata` VALUES (13001552, 0, 10, 1, 13001417, '30', '拟签横向项目', '', '');
INSERT INTO `zc_cata` VALUES (13001553, 0, 10, 1, 13001417, '40', '拟报知识产权', '', '');
INSERT INTO `zc_cata` VALUES (13001554, 0, 10, 1, 13001417, '50', '拟撰写专著', '', '');
INSERT INTO `zc_cata` VALUES (13001555, 0, 10, 1, 13001417, '60', '拟参加大赛', '', '');
INSERT INTO `zc_cata` VALUES (13001556, 0, 10, 1, 13001417, '70', '拟评个人荣誉', '', '');
INSERT INTO `zc_cata` VALUES (13001557, 13001550, 101, 1, 13001417, '101', '顶级期刊论文', '', '');
INSERT INTO `zc_cata` VALUES (13001558, 13001550, 102, 1, 13001417, '102', '核心期刊论文', '', '');
INSERT INTO `zc_cata` VALUES (13001559, 13001550, 103, 1, 13001417, '103', '普通期刊论文', '', '');
INSERT INTO `zc_cata` VALUES (13001560, 13001550, 104, 1, 13001417, '104', '会议论文', '', '');
INSERT INTO `zc_cata` VALUES (13001561, 13001551, 201, 1, 13001417, '201', '国家级课题', '', '');
INSERT INTO `zc_cata` VALUES (13001562, 13001551, 202, 1, 13001417, '202', '省部级课题', '', '');
INSERT INTO `zc_cata` VALUES (13001563, 13001551, 203, 1, 13001417, '203', '市厅级课题', '', '');
INSERT INTO `zc_cata` VALUES (13001564, 13001551, 204, 1, 13001417, '204', '校院级课题', '', '');
INSERT INTO `zc_cata` VALUES (13001565, 13001561, 2011, 1, 13001417, '2011', '国家自然科学基金', '', '');
INSERT INTO `zc_cata` VALUES (13001566, 13001561, 2012, 1, 13001417, '2012', '国家社会科学基金', '', '');
INSERT INTO `zc_cata` VALUES (13001567, 13001561, 2013, 1, 13001417, '2013', '国家重点研发计划', '', '');
INSERT INTO `zc_cata` VALUES (13001568, 13001562, 2021, 1, 13001417, '2021', '省自然科学基金', '', '');
INSERT INTO `zc_cata` VALUES (13001569, 13001562, 2022, 1, 13001417, '2022', '省社科基金', '', '');
INSERT INTO `zc_cata` VALUES (13001570, 13001552, 301, 1, 13001417, '301', '技术开发合同', '', '');
INSERT INTO `zc_cata` VALUES (13001571, 13001552, 302, 1, 13001417, '302', '技术咨询合同', '', '');
INSERT INTO `zc_cata` VALUES (13001572, 13001552, 303, 1, 13001417, '303', '技术服务合同', '', '');
INSERT INTO `zc_cata` VALUES (13001573, 13001552, 304, 1, 13001417, '304', '技术转让合同', '', '');
INSERT INTO `zc_cata` VALUES (13001574, 13001553, 401, 1, 13001417, '401', '发明专利', '', '');
INSERT INTO `zc_cata` VALUES (13001575, 13001553, 402, 1, 13001417, '402', '实用新型专利', '', '');
INSERT INTO `zc_cata` VALUES (13001576, 13001553, 403, 1, 13001417, '403', '外观设计专利', '', '');
INSERT INTO `zc_cata` VALUES (13001577, 13001553, 404, 1, 13001417, '404', '软件著作权', '', '');
INSERT INTO `zc_cata` VALUES (13001578, 13001554, 501, 1, 13001417, '501', '学术专著', '', '');
INSERT INTO `zc_cata` VALUES (13001579, 13001554, 502, 1, 13001417, '502', '教材', '', '');
INSERT INTO `zc_cata` VALUES (13001580, 13001554, 503, 1, 13001417, '503', '编著', '', '');
INSERT INTO `zc_cata` VALUES (13001581, 13001554, 504, 1, 13001417, '504', '译著', '', '');
INSERT INTO `zc_cata` VALUES (13001582, 13001555, 601, 1, 13001417, '601', '创新创业大赛', '', '');
INSERT INTO `zc_cata` VALUES (13001583, 13001555, 602, 1, 13001417, '602', '学科竞赛', '', '');
INSERT INTO `zc_cata` VALUES (13001584, 13001555, 603, 1, 13001417, '603', '技能大赛', '', '');
INSERT INTO `zc_cata` VALUES (13001585, 13001556, 701, 1, 13001417, '701', '院级荣誉', '', '');
INSERT INTO `zc_cata` VALUES (13001586, 13001556, 702, 1, 13001417, '702', '校级荣誉', '', '');
INSERT INTO `zc_cata` VALUES (13001587, 13001556, 703, 1, 13001417, '703', '省级荣誉', '', '');
INSERT INTO `zc_cata` VALUES (13001588, 13001556, 704, 1, 13001417, '704', '国家级荣誉', '', '');
INSERT INTO `zc_cata` VALUES (13001589, 13001585, 7011, 1, 13001417, '7011', '奖项', '', '');
INSERT INTO `zc_cata` VALUES (13001590, 13001585, 7012, 1, 13001417, '7012', '荣誉称号', '', '');
INSERT INTO `zc_cata` VALUES (13001591, 13001586, 7021, 1, 13001417, '7021', '奖项', '', '');
INSERT INTO `zc_cata` VALUES (13001592, 13001586, 7022, 1, 13001417, '7022', '荣誉称号', '', '');
INSERT INTO `zc_cata` VALUES (13001593, 13001587, 7031, 1, 13001417, '7031', '奖项', '', '');
INSERT INTO `zc_cata` VALUES (13001594, 13001587, 7032, 1, 13001417, '7032', '荣誉称号', '', '');
INSERT INTO `zc_cata` VALUES (13001595, 13001588, 7041, 1, 13001417, '7041', '奖项', '', '');
INSERT INTO `zc_cata` VALUES (13001596, 13001588, 7042, 1, 13001417, '7042', '荣誉称号', '', '');
INSERT INTO `zc_cata` VALUES (13001650, 0, 10, 1, 13001418, '10', '负责人', '', '');
INSERT INTO `zc_cata` VALUES (13001651, 0, 10, 1, 13001418, '20', '核心成员', '', '');
INSERT INTO `zc_cata` VALUES (13001652, 0, 10, 1, 13001418, '30', '一般成员', '', '');
INSERT INTO `zc_cata` VALUES (13001653, 0, 10, 1, 13001418, '40', '学生', '', '');
SET FOREIGN_KEY_CHECKS = 1;