提交 1f68ce56 编写于 作者: ibizdev's avatar ibizdev

Mosher 发布系统代码 [后台服务,演示应用]

上级 4708e0ca
...@@ -3,11 +3,23 @@ ...@@ -3,11 +3,23 @@
<app-scroll-container name="container_scroll1" :layoutModelDetails="layoutModelDetails"> <app-scroll-container name="container_scroll1" :layoutModelDetails="layoutModelDetails">
<template #container_scroll_main1> <template #container_scroll_main1>
<app-scroll-container name="container_scroll_main1" :layoutModelDetails="layoutModelDetails"> <app-scroll-container name="container_scroll_main1" :layoutModelDetails="layoutModelDetails">
<template #container_scroll2>
<app-scroll-container name="container_scroll2" :layoutModelDetails="layoutModelDetails">
<template #container_scroll_main2>
<app-scroll-container name="container_scroll_main2" :layoutModelDetails="layoutModelDetails">
<template #nav_pos1>
<app-nav-pos name="nav_pos1" :layoutModelDetails="layoutModelDetails" :navData="layoutModelDetails['nav_pos1'].navData"></app-nav-pos>
</template>
</app-scroll-container>
</template>
<template #container_scroll_header2>
<app-scroll-container name="container_scroll_header2" :layoutModelDetails="layoutModelDetails">
<template #nav_tabs2> <template #nav_tabs2>
<app-index-nav-tabs name="nav_tabs2" :layoutModelDetails="layoutModelDetails"></app-index-nav-tabs> <app-index-nav-tabs name="nav_tabs2" :layoutModelDetails="layoutModelDetails"></app-index-nav-tabs>
</template> </template>
<template #nav_pos1> </app-scroll-container>
<app-nav-pos name="nav_pos1" :layoutModelDetails="layoutModelDetails" :navData="layoutModelDetails['nav_pos1'].navData"></app-nav-pos> </template>
</app-scroll-container>
</template> </template>
</app-scroll-container> </app-scroll-container>
</template> </template>
...@@ -254,8 +266,11 @@ export default class IndexBase extends Vue { ...@@ -254,8 +266,11 @@ export default class IndexBase extends Vue {
* @memberof IndexBase * @memberof IndexBase
*/ */
public layoutData:any = { public layoutData:any = {
nav_tabs2:null,
nav_pos1:null, nav_pos1:null,
container_scroll_main2:null,
nav_tabs2:null,
container_scroll_header2:null,
container_scroll2:null,
container_scroll_main1:null, container_scroll_main1:null,
appmenu:null, appmenu:null,
container_scroll_left1:null, container_scroll_left1:null,
...@@ -279,9 +294,12 @@ export default class IndexBase extends Vue { ...@@ -279,9 +294,12 @@ export default class IndexBase extends Vue {
* @memberof IndexBase * @memberof IndexBase
*/ */
public layoutModelDetails:any = { public layoutModelDetails:any = {
nav_tabs2:new PanelRawitemModel({ name: 'nav_tabs2', caption: '标签页导航栏', isShowCaption: true, sysCss: '', itemType: 'RAWITEM', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'', layoutPos:'CENTER', layoutHeight:70, heightMode:'PX', layoutWidth:0, widthMode:'', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll_main1', panel: this , viewType: 'APPINDEXVIEW', predefinedType: 'NAV_TABS', contentType: '', contentStyle: '', rawContent: '', htmlContent: '', }), nav_pos1:new PanelRawitemModel({ name: 'nav_pos1', caption: '导航区占位', isShowCaption: true, sysCss: '', itemType: 'RAWITEM', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'', layoutPos:'CENTER', layoutHeight:0, heightMode:'', layoutWidth:0, widthMode:'', spacingBottom:'OUTERMEDIUM', spacingLeft:'OUTERMEDIUM', spacingRight:'OUTERMEDIUM', spacingTop:'OUTERMEDIUM', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll_main2', panel: this , viewType: 'APPINDEXVIEW', predefinedType: 'NAV_POS', contentType: '', contentStyle: '', rawContent: '', htmlContent: '', }),
nav_pos1:new PanelRawitemModel({ name: 'nav_pos1', caption: '导航区占位', isShowCaption: true, sysCss: '', itemType: 'RAWITEM', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'', layoutPos:'CENTER', layoutHeight:0, heightMode:'', layoutWidth:0, widthMode:'', spacingBottom:'OUTERMEDIUM', spacingLeft:'OUTERMEDIUM', spacingRight:'OUTERMEDIUM', spacingTop:'OUTERMEDIUM', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll_main1', panel: this , viewType: 'APPINDEXVIEW', predefinedType: 'NAV_POS', contentType: '', contentStyle: '', rawContent: '', htmlContent: '', }), container_scroll_main2:new PanelContainerModel({ name: 'container_scroll_main2', caption: '面板容器', titleBarCloseMode: 0, isShowCaption: true, sysCss: '', itemType: 'CONTAINER', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'BORDER', layoutPos:'CENTER', layoutHeight:0, heightMode:'', layoutWidth:0, widthMode:'', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll2', panel: this , details:['nav_pos1'] , dataRegionType: 'INHERIT' }),
container_scroll_main1:new PanelContainerModel({ name: 'container_scroll_main1', caption: '面板容器', titleBarCloseMode: 0, isShowCaption: true, sysCss: '', itemType: 'CONTAINER', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'BORDER', layoutPos:'CENTER', layoutHeight:0, heightMode:'', layoutWidth:80, widthMode:'PERCENTAGE', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll1', panel: this , details:['nav_tabs2','nav_pos1'] , dataRegionType: 'INHERIT' }), nav_tabs2:new PanelRawitemModel({ name: 'nav_tabs2', caption: '标签页导航栏', isShowCaption: true, sysCss: '', itemType: 'RAWITEM', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'', layoutPos:'CENTER', layoutHeight:70, heightMode:'PX', layoutWidth:0, widthMode:'', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll_header2', panel: this , viewType: 'APPINDEXVIEW', predefinedType: 'NAV_TABS', contentType: '', contentStyle: '', rawContent: '', htmlContent: '', }),
container_scroll_header2:new PanelContainerModel({ name: 'container_scroll_header2', caption: '面板容器', titleBarCloseMode: 0, isShowCaption: true, sysCss: '', itemType: 'CONTAINER', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'BORDER', layoutPos:'NORTH', layoutHeight:80, heightMode:'PX', layoutWidth:0, widthMode:'', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll2', panel: this , details:['nav_tabs2'] , dataRegionType: 'INHERIT' }),
container_scroll2:new PanelContainerModel({ name: 'container_scroll2', caption: '滚动条容器', titleBarCloseMode: 0, isShowCaption: false, sysCss: '', itemType: 'CONTAINER', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'BORDER', layoutPos:'CENTER', layoutHeight:100, heightMode:'PERCENTAGE', layoutWidth:0, widthMode:'', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll_main1', panel: this , details:['container_scroll_main2','container_scroll_header2'] , dataRegionType: 'INHERIT' }),
container_scroll_main1:new PanelContainerModel({ name: 'container_scroll_main1', caption: '面板容器', titleBarCloseMode: 0, isShowCaption: true, sysCss: '', itemType: 'CONTAINER', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'BORDER', layoutPos:'CENTER', layoutHeight:0, heightMode:'', layoutWidth:80, widthMode:'PERCENTAGE', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll1', panel: this , details:['container_scroll2'] , dataRegionType: 'INHERIT' }),
appmenu:new PanelCtrlPosModel({ name: 'appmenu', caption: '首页菜单', isShowCaption: true, sysCss: '', itemType: 'CTRLPOS', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'', layoutPos:'CENTER', layoutHeight:0, heightMode:'', layoutWidth:0, widthMode:'', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll_left1', panel: this }), appmenu:new PanelCtrlPosModel({ name: 'appmenu', caption: '首页菜单', isShowCaption: true, sysCss: '', itemType: 'CTRLPOS', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'', layoutPos:'CENTER', layoutHeight:0, heightMode:'', layoutWidth:0, widthMode:'', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll_left1', panel: this }),
container_scroll_left1:new PanelContainerModel({ name: 'container_scroll_left1', caption: '面板容器', titleBarCloseMode: 0, isShowCaption: true, sysCss: '', itemType: 'CONTAINER', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'BORDER', layoutPos:'WEST', layoutHeight:0, heightMode:'', layoutWidth:20, widthMode:'PERCENTAGE', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll1', panel: this , details:['appmenu'] , dataRegionType: 'INHERIT' }), container_scroll_left1:new PanelContainerModel({ name: 'container_scroll_left1', caption: '面板容器', titleBarCloseMode: 0, isShowCaption: true, sysCss: '', itemType: 'CONTAINER', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'BORDER', layoutPos:'WEST', layoutHeight:0, heightMode:'', layoutWidth:20, widthMode:'PERCENTAGE', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:0, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container_scroll1', panel: this , details:['appmenu'] , dataRegionType: 'INHERIT' }),
app_apptitle:new PanelFieldModel({ name: 'app_apptitle', caption: '应用标题', isShowCaption: false, sysCss: '', itemType: 'FIELD', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'', layoutPos:'', layoutHeight:0, heightMode:'', layoutWidth:0, widthMode:'', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:-1, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container1', panel: this , fieldState: '0', }), app_apptitle:new PanelFieldModel({ name: 'app_apptitle', caption: '应用标题', isShowCaption: false, sysCss: '', itemType: 'FIELD', itemStyle: 'DEFAULT', visible: true, disabled: false, layout:'', layoutPos:'', layoutHeight:0, heightMode:'', layoutWidth:0, widthMode:'', spacingBottom:'', spacingLeft:'', spacingRight:'', spacingTop:'', hAlignSelf:'', vAlignSelf:'', flexGrow:-1, flexParams:{align:'',dir:'',vAlign:''}, parentName: 'container1', panel: this , fieldState: '0', }),
......
...@@ -663,7 +663,7 @@ export default class DefaultBase extends Vue implements ControlInterface { ...@@ -663,7 +663,7 @@ export default class DefaultBase extends Vue implements ControlInterface {
*/ */
public load(opt: any = {}): void { public load(opt: any = {}): void {
if(!this.loadAction){ if(!this.loadAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKGroupByCodelistListView' + (this.$t('app.searchForm.notConfig.loadAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr9GridView' + (this.$t('app.searchForm.notConfig.loadAction') as string) });
return; return;
} }
const arg: any = { ...opt }; const arg: any = { ...opt };
...@@ -699,7 +699,7 @@ export default class DefaultBase extends Vue implements ControlInterface { ...@@ -699,7 +699,7 @@ export default class DefaultBase extends Vue implements ControlInterface {
*/ */
public loadDraft(opt: any = {},mode?:string): void { public loadDraft(opt: any = {},mode?:string): void {
if(!this.loaddraftAction){ if(!this.loaddraftAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKGroupByCodelistListView' + (this.$t('app.searchForm.notConfig.loaddraftAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr9GridView' + (this.$t('app.searchForm.notConfig.loaddraftAction') as string) });
return; return;
} }
const arg: any = { ...opt } ; const arg: any = { ...opt } ;
......
...@@ -10,7 +10,7 @@ export default class Usr2Model { ...@@ -10,7 +10,7 @@ export default class Usr2Model {
* 获取数据项集合 * 获取数据项集合
* *
* @returns {any[]} * @returns {any[]}
* @memberof Usr2DataViewMode * @memberof Usr2Dataviewexpbar_dataviewMode
*/ */
public getDataItems(): any[] { public getDataItems(): any[] {
return [ return [
...@@ -39,17 +39,6 @@ export default class Usr2Model { ...@@ -39,17 +39,6 @@ export default class Usr2Model {
dataType: 'FONTKEY', dataType: 'FONTKEY',
}, },
{
name: 'n_ibizbookname_like',
prop: 'n_ibizbookname_like',
dataType: 'QUERYPARAM'
},
{
name: 'n_price_gtandeq',
prop: 'n_price_gtandeq',
dataType: 'QUERYPARAM'
},
{ {
name:'size', name:'size',
......
...@@ -649,7 +649,7 @@ export default class Usr4Base extends Vue implements ControlInterface { ...@@ -649,7 +649,7 @@ export default class Usr4Base extends Vue implements ControlInterface {
*/ */
public load(opt: any = {}, isReset: boolean = false): void { public load(opt: any = {}, isReset: boolean = false): void {
if(!this.fetchAction){ if(!this.fetchAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr4DataView' + (this.$t('app.list.notConfig.fetchAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKTestCLDataView' + (this.$t('app.list.notConfig.fetchAction') as string) });
return; return;
} }
const arg: any = {...opt}; const arg: any = {...opt};
...@@ -728,7 +728,7 @@ export default class Usr4Base extends Vue implements ControlInterface { ...@@ -728,7 +728,7 @@ export default class Usr4Base extends Vue implements ControlInterface {
*/ */
public async remove(datas: any[]): Promise<any> { public async remove(datas: any[]): Promise<any> {
if(!this.removeAction){ if(!this.removeAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr4DataView' + (this.$t('app.gridpage.notConfig.removeAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKTestCLDataView' + (this.$t('app.gridpage.notConfig.removeAction') as string) });
return; return;
} }
let _datas:any[] = []; let _datas:any[] = [];
...@@ -837,7 +837,7 @@ export default class Usr4Base extends Vue implements ControlInterface { ...@@ -837,7 +837,7 @@ export default class Usr4Base extends Vue implements ControlInterface {
try { try {
if(Object.is(item.rowDataState, 'create')){ if(Object.is(item.rowDataState, 'create')){
if(!this.createAction){ if(!this.createAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr4DataView' + (this.$t('app.list.notConfig.createAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKTestCLDataView' + (this.$t('app.list.notConfig.createAction') as string) });
}else{ }else{
Object.assign(item,{viewparams:this.viewparams}); Object.assign(item,{viewparams:this.viewparams});
let response = await this.service.add(this.createAction, JSON.parse(JSON.stringify(this.context)),item, this.showBusyIndicator); let response = await this.service.add(this.createAction, JSON.parse(JSON.stringify(this.context)),item, this.showBusyIndicator);
...@@ -845,7 +845,7 @@ export default class Usr4Base extends Vue implements ControlInterface { ...@@ -845,7 +845,7 @@ export default class Usr4Base extends Vue implements ControlInterface {
} }
}else if(Object.is(item.rowDataState, 'update')){ }else if(Object.is(item.rowDataState, 'update')){
if(!this.updateAction){ if(!this.updateAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr4DataView' + (this.$t('app.list.notConfig.updateAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKTestCLDataView' + (this.$t('app.list.notConfig.updateAction') as string) });
}else{ }else{
Object.assign(item,{viewparams:this.viewparams}); Object.assign(item,{viewparams:this.viewparams});
if(item.ibizbook){ if(item.ibizbook){
......
...@@ -1545,7 +1545,7 @@ export default class SFormBase extends Vue implements ControlInterface { ...@@ -1545,7 +1545,7 @@ export default class SFormBase extends Vue implements ControlInterface {
*/ */
public load(opt: any = {}): void { public load(opt: any = {}): void {
if(!this.loadAction){ if(!this.loadAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZOrderSEditView3' + (this.$t('app.formpage.notconfig.loadaction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZOrderTestCLEditView2' + (this.$t('app.formpage.notconfig.loadaction') as string) });
return; return;
} }
const arg: any = { ...opt }; const arg: any = { ...opt };
...@@ -1580,7 +1580,7 @@ export default class SFormBase extends Vue implements ControlInterface { ...@@ -1580,7 +1580,7 @@ export default class SFormBase extends Vue implements ControlInterface {
*/ */
public loadDraft(opt: any = {}): void { public loadDraft(opt: any = {}): void {
if(!this.loaddraftAction){ if(!this.loaddraftAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZOrderSEditView3' + (this.$t('app.formpage.notconfig.loaddraftaction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZOrderTestCLEditView2' + (this.$t('app.formpage.notconfig.loaddraftaction') as string) });
return; return;
} }
const arg: any = { ...opt } ; const arg: any = { ...opt } ;
...@@ -1642,7 +1642,7 @@ export default class SFormBase extends Vue implements ControlInterface { ...@@ -1642,7 +1642,7 @@ export default class SFormBase extends Vue implements ControlInterface {
const action: any = Object.is(data.srfuf, '1') ? this.updateAction : this.createAction; const action: any = Object.is(data.srfuf, '1') ? this.updateAction : this.createAction;
if(!action){ if(!action){
let actionName:any = Object.is(data.srfuf, '1')?"updateAction":"createAction"; let actionName:any = Object.is(data.srfuf, '1')?"updateAction":"createAction";
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZOrderSEditView3' + (this.$t('app.formpage.notconfig.actionname') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZOrderTestCLEditView2' + (this.$t('app.formpage.notconfig.actionname') as string) });
return; return;
} }
Object.assign(arg,{viewparams:this.viewparams}); Object.assign(arg,{viewparams:this.viewparams});
...@@ -1750,7 +1750,7 @@ export default class SFormBase extends Vue implements ControlInterface { ...@@ -1750,7 +1750,7 @@ export default class SFormBase extends Vue implements ControlInterface {
const action: any = Object.is(data.srfuf, '1') ? this.updateAction : this.createAction; const action: any = Object.is(data.srfuf, '1') ? this.updateAction : this.createAction;
if(!action){ if(!action){
let actionName:any = Object.is(data.srfuf, '1')?"updateAction":"createAction"; let actionName:any = Object.is(data.srfuf, '1')?"updateAction":"createAction";
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZOrderSEditView3' + (this.$t('app.formpage.notconfig.actionname') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZOrderTestCLEditView2' + (this.$t('app.formpage.notconfig.actionname') as string) });
return; return;
} }
Object.assign(arg,{viewparams:this.viewparams}); Object.assign(arg,{viewparams:this.viewparams});
...@@ -1827,7 +1827,7 @@ export default class SFormBase extends Vue implements ControlInterface { ...@@ -1827,7 +1827,7 @@ export default class SFormBase extends Vue implements ControlInterface {
public remove(opt:Array<any> = [],showResultInfo?: boolean): Promise<any> { public remove(opt:Array<any> = [],showResultInfo?: boolean): Promise<any> {
return new Promise((resolve: any, reject: any) => { return new Promise((resolve: any, reject: any) => {
if(!this.removeAction){ if(!this.removeAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZOrderSEditView3' + (this.$t('app.formpage.notconfig.removeaction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZOrderTestCLEditView2' + (this.$t('app.formpage.notconfig.removeaction') as string) });
return; return;
} }
const arg: any = opt[0]; const arg: any = opt[0];
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册