提交 44297bc5 编写于 作者: ibizdev's avatar ibizdev

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

上级 00ac51fe
.app-user-button { .app-login-button {
width: 100%;
.ivu-btn { .ivu-btn {
width: 100%; width: 100%;
height: 100%;
} }
} }
\ No newline at end of file
<template> <template>
<div class="app-user-button"> <div :class="[model.sysCss, 'app-login-button']" :style="containerStyle">
<i-button @click="handleSubmit" :type="type">{{ caption }} </i-button> <i-button @click="handleClick" :type="curStyle">
<span v-show="model.isShowCaption">{{ model.caption }}</span>
</i-button>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { Vue, Component, Watch, Prop, Model } from "vue-property-decorator"; import { PanelButtonModel } from "@/model/panel-detail";
import { Vue, Component, Prop } from "vue-property-decorator";
@Component({}) @Component({})
export default class AppUserId extends Vue { export default class AppLoginButton extends Vue {
@Prop() public predefinedType!: string; /**
* 模型
*
* @type {PanelButtonModel}
* @memberof AppLoginButton
*/
@Prop() public model!: PanelButtonModel;
@Prop() public type?: string; /**
* 类型
*
* @type {string}
* @memberof AppLoginButton
*/
@Prop() public defaultStyle?: string;
@Prop() public caption!: string; /**
* 当前按钮类型
*
* @type {string}
* @memberof AppLoginButton
*/
get curStyle(): string {
if (this.model.buttonStyle != "DEFAULT" && this.defaultStyle) {
return this.defaultStyle;
} else {
return this.model.buttonStyle.toLowerCase();
}
}
/**
* 按钮样式
*
* @type {string}
* @memberof AppLoginButton
*/
public containerStyle: any = null;
/**
* 处理点击
*
* @type {string}
* @memberof AppLoginButton
*/
public handleClick() {
switch (this.model.predefinedType) {
case "APP_LOGOUT":
this.logout();
break;
case "APP_REGISTER":
this.register();
break;
default:
this.$emit("itemClick", this.model.predefinedType);
}
}
public mounted() {
if (this.model) {
this.containerStyle = this.model.getElementStyle();
}
}
/**
* 登出
*
* @type {string}
* @memberof AppLoginButton
*/
public logout() {
this.$http
.get("/v7/logout")
.then((response: any) => {
if (response && response.status === 200) {
localStorage.removeItem("user");
localStorage.removeItem("token");
let leftTime = new Date();
leftTime.setTime(leftTime.getSeconds() - 1);
document.cookie = "ibzuaa-token=;expires=" + leftTime.toUTCString();
this.$router.push({ name: "login" });
}
})
.catch((error: any) => {
console.error(error);
});
}
public handleSubmit() { /**
this.$emit('itemClick', this.predefinedType); * 注册
*
* @type {string}
* @memberof AppLoginButton
*/
public register() {
// todo
} }
} }
</script> </script>
<style lang="less"> <style lang="less">
@import './app-login-button.less'; @import "./app-login-button.less";
</style> </style>
...@@ -12,6 +12,7 @@ export class PanelButtonModel extends PanelDetailModel { ...@@ -12,6 +12,7 @@ export class PanelButtonModel extends PanelDetailModel {
constructor(opts: any = {}) { constructor(opts: any = {}) {
super(opts); super(opts);
this.uiaction = opts.uiaction; this.uiaction = opts.uiaction;
this.buttonStyle = opts.buttonStyle;
} }
/** /**
...@@ -23,6 +24,11 @@ export class PanelButtonModel extends PanelDetailModel { ...@@ -23,6 +24,11 @@ export class PanelButtonModel extends PanelDetailModel {
public uiaction:any; public uiaction:any;
/**
* @description 按钮类型
* @type {string}
* @memberof PanelButtonModel
*/
public buttonStyle: string;
} }
\ No newline at end of file
...@@ -68,7 +68,7 @@ ...@@ -68,7 +68,7 @@
<app-index-user-info name="auth_userinfo1" :layoutModelDetails="layoutModelDetails"></app-index-user-info> <app-index-user-info name="auth_userinfo1" :layoutModelDetails="layoutModelDetails"></app-index-user-info>
</template> </template>
<template #auth_logout1> <template #auth_logout1>
<app-login-button class="app-logout-button" :model="layoutModelDetails.auth_logout1" :caption="$t('components.login.logout')" @itemClick="handleItemClick" /> <app-login-button class="app-logout-button" :model="layoutModelDetails.auth_logout1" @itemClick="handleItemClick" />
</template> </template>
</app-simpleflex-container> </app-simpleflex-container>
</template> </template>
......
...@@ -14,16 +14,16 @@ ...@@ -14,16 +14,16 @@
<app-login-org /> <app-login-org />
</template> </template>
<template #auth_loginbutton1> <template #auth_loginbutton1>
<app-login-button class="app-login-button" :model="layoutModelDetails.auth_loginbutton1" type='primary' :caption="$t('components.login.name')" @itemClick="handleItemClick" /> <app-login-button class="app-login-button" :model="layoutModelDetails.auth_loginbutton1" defaultStyle='primary' @itemClick="handleItemClick" />
</template> </template>
<template #auth_registbutton1> <template #auth_registbutton1>
<span>按钮</span> <span>按钮</span>
</template> </template>
<template #auth_resetinput1> <template #auth_resetinput1>
<app-login-button class="app-reset-button" :model="layoutModelDetails.auth_resetinput1" type='success' :caption="$t('components.login.reset')" @itemClick="handleItemClick" /> <app-login-button class="app-reset-button" :model="layoutModelDetails.auth_resetinput1" defaultStyle='success' @itemClick="handleItemClick" />
</template> </template>
<template #auth_logout1> <template #auth_logout1>
<app-login-button class="app-logout-button" :model="layoutModelDetails.auth_logout1" :caption="$t('components.login.logout')" @itemClick="handleItemClick" /> <app-login-button class="app-logout-button" :model="layoutModelDetails.auth_logout1" @itemClick="handleItemClick" />
</template> </template>
<template #auth_captcha1> <template #auth_captcha1>
<app-login-captcha /> <app-login-captcha />
......
...@@ -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: 'IBIZBOOKUsr9GridView' + (this.$t('app.searchForm.notConfig.loadAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr5DataView' + (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: 'IBIZBOOKUsr9GridView' + (this.$t('app.searchForm.notConfig.loaddraftAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr5DataView' + (this.$t('app.searchForm.notConfig.loaddraftAction') as string) });
return; return;
} }
const arg: any = { ...opt } ; const arg: any = { ...opt } ;
......
...@@ -48,18 +48,18 @@ ...@@ -48,18 +48,18 @@
<div v-show="flag" class="batch-toolbar"> <div v-show="flag" class="batch-toolbar">
<div class='toolbar-container'> <div class='toolbar-container'>
<tooltip :transfer="true" :max-width="600"> <tooltip :transfer="true" :max-width="600">
<i-button v-show="dataviewexpviewdataviewexpbar_dataview_batchtoolbarModels.deuiaction1.visabled" :disabled="dataviewexpviewdataviewexpbar_dataview_batchtoolbarModels.deuiaction1.disabled" class='' v-loading:i-button @click="dataviewexpbar_dataview_batchtoolbar_click({ tag: 'deuiaction1' }, $event)"> <i-button v-show="usr2dataviewdataview_batchtoolbarModels.deuiaction1.visabled" :disabled="usr2dataviewdataview_batchtoolbarModels.deuiaction1.disabled" class='' v-loading:i-button @click="dataview_batchtoolbar_click({ tag: 'deuiaction1' }, $event)">
<i class='fa fa-edit'></i> <i class='fa fa-edit'></i>
<span class='caption'>{{$t('entities.ibizbook.dataviewexpviewdataviewexpbar_dataview_batchtoolbar_toolbar.deuiaction1.caption')}}</span> <span class='caption'>{{$t('entities.ibizbook.usr2dataviewdataview_batchtoolbar_toolbar.deuiaction1.caption')}}</span>
</i-button> </i-button>
<div slot='content'>{{$t('entities.ibizbook.dataviewexpviewdataviewexpbar_dataview_batchtoolbar_toolbar.deuiaction1.tip')}}</div> <div slot='content'>{{$t('entities.ibizbook.usr2dataviewdataview_batchtoolbar_toolbar.deuiaction1.tip')}}</div>
</tooltip> </tooltip>
<tooltip :transfer="true" :max-width="600"> <tooltip :transfer="true" :max-width="600">
<i-button v-show="dataviewexpviewdataviewexpbar_dataview_batchtoolbarModels.deuiaction2.visabled" :disabled="dataviewexpviewdataviewexpbar_dataview_batchtoolbarModels.deuiaction2.disabled" class='' v-loading:i-button @click="dataviewexpbar_dataview_batchtoolbar_click({ tag: 'deuiaction2' }, $event)"> <i-button v-show="usr2dataviewdataview_batchtoolbarModels.deuiaction2.visabled" :disabled="usr2dataviewdataview_batchtoolbarModels.deuiaction2.disabled" class='' v-loading:i-button @click="dataview_batchtoolbar_click({ tag: 'deuiaction2' }, $event)">
<i class='fa fa-remove'></i> <i class='fa fa-remove'></i>
<span class='caption'>{{$t('entities.ibizbook.dataviewexpviewdataviewexpbar_dataview_batchtoolbar_toolbar.deuiaction2.caption')}}</span> <span class='caption'>{{$t('entities.ibizbook.usr2dataviewdataview_batchtoolbar_toolbar.deuiaction2.caption')}}</span>
</i-button> </i-button>
<div slot='content'>{{$t('entities.ibizbook.dataviewexpviewdataviewexpbar_dataview_batchtoolbar_toolbar.deuiaction2.tip')}}</div> <div slot='content'>{{$t('entities.ibizbook.usr2dataviewdataview_batchtoolbar_toolbar.deuiaction2.tip')}}</div>
</tooltip> </tooltip>
</div> </div>
</div> </div>
...@@ -174,18 +174,18 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -174,18 +174,18 @@ export default class Usr2Base extends Vue implements ControlInterface {
public appEntityService: IBIZBOOKEntityService = new IBIZBOOKEntityService({ $store: this.$store }); public appEntityService: IBIZBOOKEntityService = new IBIZBOOKEntityService({ $store: this.$store });
/** /**
* dataviewexpbar_dataview_batchtoolbar 部件 click 事件 * dataview_batchtoolbar 部件 click 事件
* *
* @param {*} [args={}] * @param {*} [args={}]
* @param {*} $event * @param {*} $event
* @memberof Usr2Base * @memberof Usr2Base
*/ */
public dataviewexpbar_dataview_batchtoolbar_click($event: any, $event2?: any) { public dataview_batchtoolbar_click($event: any, $event2?: any) {
if (Object.is($event.tag, 'deuiaction1')) { if (Object.is($event.tag, 'deuiaction1')) {
this.dataviewexpbar_dataview_batchtoolbar_deuiaction1_click(null, 'dataviewexpbar_dataview_batchtoolbar', $event2); this.dataview_batchtoolbar_deuiaction1_click(null, 'dataview_batchtoolbar', $event2);
} }
if (Object.is($event.tag, 'deuiaction2')) { if (Object.is($event.tag, 'deuiaction2')) {
this.dataviewexpbar_dataview_batchtoolbar_deuiaction2_click(null, 'dataviewexpbar_dataview_batchtoolbar', $event2); this.dataview_batchtoolbar_deuiaction2_click(null, 'dataview_batchtoolbar', $event2);
} }
} }
...@@ -198,7 +198,7 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -198,7 +198,7 @@ export default class Usr2Base extends Vue implements ControlInterface {
* @param {*} [$event] * @param {*} [$event]
* @memberof * @memberof
*/ */
public dataviewexpbar_dataview_batchtoolbar_deuiaction1_click(params: any = {}, tag?: any, $event?: any) { public dataview_batchtoolbar_deuiaction1_click(params: any = {}, tag?: any, $event?: any) {
// 参数 // 参数
// 取数 // 取数
let datas: any[] = []; let datas: any[] = [];
...@@ -226,7 +226,7 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -226,7 +226,7 @@ export default class Usr2Base extends Vue implements ControlInterface {
* @param {*} [$event] * @param {*} [$event]
* @memberof * @memberof
*/ */
public dataviewexpbar_dataview_batchtoolbar_deuiaction2_click(params: any = {}, tag?: any, $event?: any) { public dataview_batchtoolbar_deuiaction2_click(params: any = {}, tag?: any, $event?: any) {
// 参数 // 参数
// 取数 // 取数
let datas: any[] = []; let datas: any[] = [];
...@@ -254,7 +254,7 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -254,7 +254,7 @@ export default class Usr2Base extends Vue implements ControlInterface {
* @param {*} [$event] * @param {*} [$event]
* @memberof * @memberof
*/ */
public dataviewexpbar_dataview_memo1_u37f11a8_click(params: any = {}, tag?: any, $event?: any) { public dataview_memo1_u37f11a8_click(params: any = {}, tag?: any, $event?: any) {
// 取数 // 取数
let datas: any[] = []; let datas: any[] = [];
let xData: any = null; let xData: any = null;
...@@ -281,7 +281,7 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -281,7 +281,7 @@ export default class Usr2Base extends Vue implements ControlInterface {
* @param {*} [$event] * @param {*} [$event]
* @memberof * @memberof
*/ */
public dataviewexpbar_dataview_memo1_uc365542_click(params: any = {}, tag?: any, $event?: any) { public dataview_memo1_uc365542_click(params: any = {}, tag?: any, $event?: any) {
// 取数 // 取数
let datas: any[] = []; let datas: any[] = [];
let xData: any = null; let xData: any = null;
...@@ -309,7 +309,7 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -309,7 +309,7 @@ export default class Usr2Base extends Vue implements ControlInterface {
* @param {*} [$event] 事件源 * @param {*} [$event] 事件源
* @param {*} [xData] 执行行为所需当前部件 * @param {*} [xData] 执行行为所需当前部件
* @param {*} [actionContext] 执行行为上下文 * @param {*} [actionContext] 执行行为上下文
* @memberof IBIZBOOKDataViewExpViewBase * @memberof IBIZBOOKUsr2DataViewBase
*/ */
public Edit(args: any[],contextJO?:any, params?: any, $event?: any, xData?: any,actionContext?:any,srfParentDeName?:string) { public Edit(args: any[],contextJO?:any, params?: any, $event?: any, xData?: any,actionContext?:any,srfParentDeName?:string) {
if (args.length === 0) { if (args.length === 0) {
...@@ -335,7 +335,7 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -335,7 +335,7 @@ export default class Usr2Base extends Vue implements ControlInterface {
* @param {*} [$event] 事件源 * @param {*} [$event] 事件源
* @param {*} [xData] 执行行为所需当前部件 * @param {*} [xData] 执行行为所需当前部件
* @param {*} [actionContext] 执行行为上下文 * @param {*} [actionContext] 执行行为上下文
* @memberof IBIZBOOKDataViewExpViewBase * @memberof IBIZBOOKUsr2DataViewBase
*/ */
public Remove(args: any[],contextJO?:any, params?: any, $event?: any, xData?: any,actionContext?:any,srfParentDeName?:string) { public Remove(args: any[],contextJO?:any, params?: any, $event?: any, xData?: any,actionContext?:any,srfParentDeName?:string) {
const _this: any = this; const _this: any = this;
...@@ -629,9 +629,9 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -629,9 +629,9 @@ export default class Usr2Base extends Vue implements ControlInterface {
* 工具栏模型 * 工具栏模型
* *
* @type {*} * @type {*}
* @memberof IBIZBOOKDataViewExpView * @memberof IBIZBOOKUsr2DataView
*/ */
public dataviewexpviewdataviewexpbar_dataview_batchtoolbarModels: any = { public usr2dataviewdataview_batchtoolbarModels: any = {
deuiaction1: { name: 'deuiaction1', actiontarget: 'NONE', caption: '编辑', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Edit', target: 'SINGLEKEY' } }, deuiaction1: { name: 'deuiaction1', actiontarget: 'NONE', caption: '编辑', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Edit', target: 'SINGLEKEY' } },
deuiaction2: { name: 'deuiaction2', actiontarget: 'NONE', caption: '删除', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Remove', target: 'MULTIKEY' } }, deuiaction2: { name: 'deuiaction2', actiontarget: 'NONE', caption: '删除', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Remove', target: 'MULTIKEY' } },
...@@ -956,7 +956,7 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -956,7 +956,7 @@ export default class Usr2Base 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: 'IBIZBOOKDataViewExpView' + (this.$t('app.list.notConfig.fetchAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr2DataView' + (this.$t('app.list.notConfig.fetchAction') as string) });
return; return;
} }
const arg: any = {...opt}; const arg: any = {...opt};
...@@ -1036,7 +1036,7 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -1036,7 +1036,7 @@ export default class Usr2Base 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: 'IBIZBOOKDataViewExpView' + (this.$t('app.gridpage.notConfig.removeAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr2DataView' + (this.$t('app.gridpage.notConfig.removeAction') as string) });
return; return;
} }
let _datas:any[] = []; let _datas:any[] = [];
...@@ -1146,7 +1146,7 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -1146,7 +1146,7 @@ export default class Usr2Base 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: 'IBIZBOOKDataViewExpView' + (this.$t('app.list.notConfig.createAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr2DataView' + (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);
...@@ -1154,7 +1154,7 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -1154,7 +1154,7 @@ export default class Usr2Base 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: 'IBIZBOOKDataViewExpView' + (this.$t('app.list.notConfig.updateAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr2DataView' + (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){
...@@ -1245,16 +1245,16 @@ export default class Usr2Base extends Vue implements ControlInterface { ...@@ -1245,16 +1245,16 @@ export default class Usr2Base extends Vue implements ControlInterface {
public uiAction(data: any, tag: any, $event: any) { public uiAction(data: any, tag: any, $event: any) {
$event.stopPropagation(); $event.stopPropagation();
if(Object.is('Edit', tag)) { if(Object.is('Edit', tag)) {
this.dataviewexpbar_dataview_batchtoolbar_deuiaction1_click(data, tag, $event); this.dataview_batchtoolbar_deuiaction1_click(data, tag, $event);
} }
if(Object.is('Remove', tag)) { if(Object.is('Remove', tag)) {
this.dataviewexpbar_dataview_batchtoolbar_deuiaction2_click(data, tag, $event); this.dataview_batchtoolbar_deuiaction2_click(data, tag, $event);
} }
if(Object.is('Edit', tag)) { if(Object.is('Edit', tag)) {
this.dataviewexpbar_dataview_memo1_u37f11a8_click(data, tag, $event); this.dataview_memo1_u37f11a8_click(data, tag, $event);
} }
if(Object.is('Remove', tag)) { if(Object.is('Remove', tag)) {
this.dataviewexpbar_dataview_memo1_uc365542_click(data, tag, $event); this.dataview_memo1_uc365542_click(data, tag, $event);
} }
} }
......
...@@ -10,7 +10,7 @@ export default class Usr2Model { ...@@ -10,7 +10,7 @@ export default class Usr2Model {
* 获取数据项集合 * 获取数据项集合
* *
* @returns {any[]} * @returns {any[]}
* @memberof Usr2Dataviewexpbar_dataviewMode * @memberof Usr2DataViewMode
*/ */
public getDataItems(): any[] { public getDataItems(): any[] {
return [ return [
...@@ -39,6 +39,17 @@ export default class Usr2Model { ...@@ -39,6 +39,17 @@ 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',
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册