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

ibiz4j 部署微服务应用

上级 ee01c320
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
<component <component
:is="viewname" :is="viewname"
class="viewcontainer2" class="viewcontainer2"
:viewdata ="viewdata" :viewdata ="viewdata"
:viewparam="viewparam"
:viewDefaultUsage="false" :viewDefaultUsage="false"
:formDruipart="formDruipart" :formDruipart="formDruipart"
:isformDruipart="true" :isformDruipart="true"
...@@ -119,6 +120,22 @@ export default class AppFormDRUIPart extends Vue { ...@@ -119,6 +120,22 @@ export default class AppFormDRUIPart extends Vue {
*/ */
@Prop() public viewparams!: any; @Prop() public viewparams!: any;
/**
* 局部上下文
*
* @type {*}
* @memberof AppFormDRUIPart
*/
@Prop() public localContext!:any;
/**
* 局部参数
*
* @type {*}
* @memberof AppFormDRUIPart
*/
@Prop() public localParam!:any;
/** /**
* 应用实体参数名称 * 应用实体参数名称
* *
...@@ -240,21 +257,32 @@ export default class AppFormDRUIPart extends Vue { ...@@ -240,21 +257,32 @@ export default class AppFormDRUIPart extends Vue {
} }
const formData: any = data?data:JSON.parse(this.data); const formData: any = data?data:JSON.parse(this.data);
const _paramitem = formData[this.paramItem]; const _paramitem = formData[this.paramItem];
let viewdata = {}; let tempContext:any = {};
Object.assign(viewdata, this.$viewTool.getIndexViewParam()); let tempParam:any = {};
Object.assign(tempContext, this.$viewTool.getIndexViewParam());
const _parameters: any[] = [...this.$viewTool.getIndexParameters(), ...this.parameters]; const _parameters: any[] = [...this.$viewTool.getIndexParameters(), ...this.parameters];
_parameters.forEach((parameter: any) => { _parameters.forEach((parameter: any) => {
const { pathName, parameterName }: { pathName: string, parameterName: string } = parameter; const { pathName, parameterName }: { pathName: string, parameterName: string } = parameter;
if (formData[parameterName] && !Object.is(formData[parameterName], '')) { if (formData[parameterName] && !Object.is(formData[parameterName], '')) {
Object.assign(viewdata, { [parameterName]: formData[parameterName] }); Object.assign(tempContext, { [parameterName]: formData[parameterName] });
} }
}); });
Object.assign(viewdata, { [this.paramItem]: _paramitem }); Object.assign(tempContext, { [this.paramItem]: _paramitem });
//设置顶层视图唯一标识 //设置顶层视图唯一标识
Object.assign(viewdata,this.context); Object.assign(tempContext,this.context);
Object.assign(viewdata,{srfparentdename:this.parentName,srfparentkey:_paramitem}); Object.assign(tempContext,{srfparentdename:this.parentName,srfparentkey:_paramitem});
this.viewdata = JSON.stringify(viewdata); // 设置局部上下文
this.viewparam = JSON.stringify(this.viewparams); if(this.localContext && Object.keys(this.localContext).length >0){
let _context:any = this.$util.computedNavData(formData,tempContext,this.viewparams,this.localContext);
Object.assign(tempContext,_context);
}
this.viewdata = JSON.stringify(tempContext);
// 设置局部参数
if(this.localParam && Object.keys(this.localParam).length >0){
let _param:any = this.$util.computedNavData(formData,tempContext,this.viewparams,this.localParam);
Object.assign(tempParam,_param);
}
this.viewparam = JSON.stringify(tempParam);
if (this.isRelationalData) { if (this.isRelationalData) {
if (!_paramitem || _paramitem == null || Object.is(_paramitem, '')) { if (!_paramitem || _paramitem == null || Object.is(_paramitem, '')) {
this.blockUIStart(); this.blockUIStart();
......
<template> <template>
<div class="app-picker-select-view"> <div class="app-picker-select-view">
<Dropdown :visible="visible" trigger="custom" style="left:0px;width: 100%" @on-clickoutside="() => {triggerMenu(false);}" > <Dropdown :visible="visible" trigger="custom" style="left:0px;width: 100%" @on-clickoutside="() => {triggerMenu(false);}" >
<Input v-if="isSingleSelect" v-model="queryValue" class="tree-input" type="text" :placeholder="placeholder ? placeholder : $t('components.AppPickerSelectViewSelectView.placeholder')" :disabled="disabled" @on-change="OnInputChange" @on-focus="()=>{triggerMenu(true);}" > <Input v-if="isSingleSelect" v-model="queryValue" class="tree-input" type="text" :placeholder="placeholder ? placeholder : $t('components.appPickerSelectView.placeholder')" :disabled="disabled" @on-change="OnInputChange" @on-focus="()=>{triggerMenu(true);}" >
<template v-slot:suffix> <template v-slot:suffix>
<i v-if="queryValue && !disabled" class='el-icon-circle-close' @click="onClear"></i> <i v-if="queryValue && !disabled" class='el-icon-circle-close' @click="onClear"></i>
<Icon :type="visible ? 'ios-arrow-up' : 'ios-arrow-down'" class="icon-arrow" @click="() => {triggerMenu();}"></Icon> <Icon :type="visible ? 'ios-arrow-up' : 'ios-arrow-down'" class="icon-arrow" @click="() => {triggerMenu();}"></Icon>
...@@ -34,7 +34,7 @@ import { ViewTool } from '@/utils/view-tool/view-tool'; ...@@ -34,7 +34,7 @@ import { ViewTool } from '@/utils/view-tool/view-tool';
@Component({ @Component({
}) })
export default class AppPickerSelectViewSelectView extends Vue { export default class AppPickerSelectView extends Vue {
/** /**
* 视图上下文 * 视图上下文
* *
...@@ -256,7 +256,7 @@ export default class AppPickerSelectViewSelectView extends Vue { ...@@ -256,7 +256,7 @@ export default class AppPickerSelectViewSelectView extends Vue {
*/ */
public handlePublicParams(arg: any): boolean { public handlePublicParams(arg: any): boolean {
if (!this.data) { if (!this.data) {
this.$Notice.error({ title: (this.$t('components.AppPickerSelectViewSelectView.error') as any), desc: (this.$t('components.AppPickerSelectViewSelectView.formdataException') as any) }); this.$Notice.error({ title: (this.$t('components.appPickerSelectView.error') as any), desc: (this.$t('components.appPickerSelectView.formdataException') as any) });
return false; return false;
} }
// 合并表单参数 // 合并表单参数
...@@ -306,7 +306,7 @@ export default class AppPickerSelectViewSelectView extends Vue { ...@@ -306,7 +306,7 @@ export default class AppPickerSelectViewSelectView extends Vue {
if(this.isSingleSelect){ if(this.isSingleSelect){
this.queryValue = newVal; this.queryValue = newVal;
if (!this.data || !this.valueitem || !this.data[this.valueitem]) { if (!this.data || !this.valueitem || !this.data[this.valueitem]) {
this.$Notice.error({ title: (this.$t('components.AppPickerSelectViewSelectView.error') as any), desc: (this.$t('components.AppPickerSelectViewSelectView.editor') as any)+this.name+(this.$t('components.AppPickerSelectViewSelectView.valueitemException') as any) }); this.$Notice.error({ title: (this.$t('components.appPickerSelectView.error') as any), desc: (this.$t('components.appPickerSelectView.editor') as any)+this.name+(this.$t('components.appPickerSelectView.valueitemException') as any) });
}else{ }else{
let _viewparam = JSON.parse(this.viewparam); let _viewparam = JSON.parse(this.viewparam);
_viewparam.selectedData = [{srfkey: this.data[this.valueitem], srfmajortext: this.value }]; _viewparam.selectedData = [{srfkey: this.data[this.valueitem], srfmajortext: this.value }];
...@@ -418,7 +418,7 @@ export default class AppPickerSelectViewSelectView extends Vue { ...@@ -418,7 +418,7 @@ export default class AppPickerSelectViewSelectView extends Vue {
*/ */
public openLinkView($event: any): void { public openLinkView($event: any): void {
if (!this.data || !this.valueitem || !this.data[this.valueitem]) { if (!this.data || !this.valueitem || !this.data[this.valueitem]) {
console.error({ title: (this.$t('components.AppPickerSelectViewSelectView.error') as any), desc: (this.$t('components.AppPickerSelectViewSelectView.editor') as any)+this.name+(this.$t('components.AppPickerSelectViewSelectView.valueitemException') as any) }); console.error({ title: (this.$t('components.appPickerSelectView.error') as any), desc: (this.$t('components.appPickerSelectView.editor') as any)+this.name+(this.$t('components.appPickerSelectView.valueitemException') as any) });
return; return;
} }
// 公共参数处理 // 公共参数处理
......
<template> <template>
<codelist v-if="tag" :tag="tag" :value="value" :codelistType="codelistType" :renderMode="renderMode" :valueSeparator="valueSeparator" :textSeparator="textSeparator" :data="data" :itemParam="itemParam" :context="context" :viewparams="viewparams"></codelist> <codelist v-if="tag" :tag="tag" :value="value" :codelistType="codelistType" :renderMode="renderMode" :valueSeparator="valueSeparator" :textSeparator="textSeparator" :data="data" :localContext="localContext" :localParam="localParam" :context="context" :viewparams="viewparams"></codelist>
<app-upload-file-info v-else-if="Object.is(this.editorType,'PICTURE') || Object.is(this.editorType,'PICTURE_ONE') || Object.is(this.editorType,'FILEUPLOADER')" :value="value" :name="name"></app-upload-file-info> <app-upload-file-info v-else-if="Object.is(this.editorType,'PICTURE') || Object.is(this.editorType,'PICTURE_ONE') || Object.is(this.editorType,'FILEUPLOADER')" :value="value" :name="name"></app-upload-file-info>
<span class="app-span" v-else >{{text}}</span> <span class="app-span" v-else >{{text}}</span>
</template> </template>
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
v-for="(item,i) in dataRight" v-for="(item,i) in dataRight"
:key="i" :key="i"
>{{dataLeft[item-1].label}}</Option> >{{dataLeft[item-1].label}}</Option>
<el-transfer v-model="dataRight" :data="dataLeft" @change=dataChange></el-transfer> <el-transfer v-model="dataRight" :data="dataLeft" @change="dataChange"></el-transfer>
</Select> </Select>
</template> </template>
<script lang="ts"> <script lang="ts">
...@@ -14,11 +14,11 @@ import { Vue, Component, Watch, Prop, Model } from "vue-property-decorator"; ...@@ -14,11 +14,11 @@ import { Vue, Component, Watch, Prop, Model } from "vue-property-decorator";
import CodeListService from "@service/app/codelist-service"; import CodeListService from "@service/app/codelist-service";
@Component({}) @Component({})
export default class FromTransfer extends Vue { export default class AppTransfer extends Vue {
/** /**
* 表单传递右侧框中的数据 * 表单传递右侧框中的数据
*/ */
@Prop() public data: any; @Prop() public data?: any;
/** /**
* 左侧框数据 * 左侧框数据
*/ */
...@@ -31,7 +31,7 @@ export default class FromTransfer extends Vue { ...@@ -31,7 +31,7 @@ export default class FromTransfer extends Vue {
* 代码表服务对象 * 代码表服务对象
* *
* @type {CodeListService} * @type {CodeListService}
* @memberof FromTransfer * @memberof AppTransfer
*/ */
public codeListService: CodeListService = new CodeListService({ public codeListService: CodeListService = new CodeListService({
...@@ -42,21 +42,21 @@ export default class FromTransfer extends Vue { ...@@ -42,21 +42,21 @@ export default class FromTransfer extends Vue {
* 额外参数 * 额外参数
* *
* @type {*} * @type {*}
* @memberof FromTransfer * @memberof AppTransfer
*/ */
public otherParam: any; public otherParam: any;
/** /**
* 查询参数 * 查询参数
* @type {*} * @type {*}
* @memberof FromTransfer * @memberof AppTransfer
*/ */
public queryParam: any; public queryParam: any;
/** /**
* 当前选中值 * 当前选中值
* @type {any} * @type {any}
* @memberof Drop * @memberof AppTransfer
*/ */
@Model("change") readonly itemValue!: any; @Model("change") readonly itemValue!: any;
...@@ -64,7 +64,7 @@ export default class FromTransfer extends Vue { ...@@ -64,7 +64,7 @@ export default class FromTransfer extends Vue {
* 代码表标识 * 代码表标识
* *
* @type {string} * @type {string}
* @memberof FromTransfer * @memberof AppTransfer
*/ */
@Prop() public tag?: string; @Prop() public tag?: string;
...@@ -72,15 +72,14 @@ export default class FromTransfer extends Vue { ...@@ -72,15 +72,14 @@ export default class FromTransfer extends Vue {
* 代码表类型 * 代码表类型
* *
* @type {string} * @type {string}
* @memberof FromTransfer * @memberof AppTransfer
*/ */
@Prop() public codelistType?: string; @Prop() public codelistType?: string;
/** /**
* 监听表单数据 * 监听表单数据
* *
* @memberof FromTransfer * @memberof AppTransfer
*/ */
@Watch("data", { deep: true }) @Watch("data", { deep: true })
...@@ -90,27 +89,27 @@ export default class FromTransfer extends Vue { ...@@ -90,27 +89,27 @@ export default class FromTransfer extends Vue {
} }
/** /**
* 组件change事件,右侧框数据变化时 * 组件change事件,右侧框数据变化时
* @memberof FromTransfer * @memberof AppTransfer
*/ */
dataChange(e:any){ dataChange(e: any) {
console.log(e); console.log(e);
let val:any[]=[]; let val: any[] = [];
let newVal:any; let newVal: any;
this.dataLeft.forEach((elem: any) => { this.dataLeft.forEach((elem: any) => {
e.forEach((item: any) => { e.forEach((item: any) => {
if (elem.key === item) val.push(elem.value); if (elem.key === item) val.push(elem.value);
}); });
}); });
newVal=val.join(','); newVal = val.join(",");
console.log(newVal); console.log(newVal, typeof newVal);
this.$emit("change", newVal); if (newVal) this.$emit("change", newVal);
} }
/** /**
* 传入额外参数 * 传入额外参数
* *
* @type {*} * @type {*}
* @memberof FromTransfer * @memberof AppTransfer
*/ */
@Prop() public itemParam?: any; @Prop() public itemParam?: any;
...@@ -133,7 +132,7 @@ export default class FromTransfer extends Vue { ...@@ -133,7 +132,7 @@ export default class FromTransfer extends Vue {
/** /**
* 是否禁用 * 是否禁用
* @type {any} * @type {any}
* @memberof FromTransfer * @memberof AppTransfer
* *
*/ */
@Prop() public disabled?: any; @Prop() public disabled?: any;
...@@ -141,43 +140,22 @@ export default class FromTransfer extends Vue { ...@@ -141,43 +140,22 @@ export default class FromTransfer extends Vue {
/** /**
* 是否支持过滤 * 是否支持过滤
* @type {boolean} * @type {boolean}
* @memberof FromTransfer * @memberof AppTransfer
*/ */
@Prop() public filterable?: boolean; @Prop() public filterable?: boolean;
/** /**
* 下拉选提示内容 * 下拉选提示内容
* @type {string} * @type {string}
* @memberof FromTransfer * @memberof AppTransfer
*/ */
@Prop() public placeholder?: string; @Prop() public placeholder?: string;
/**
* 计算属性(当前值)
* @type {any}
* @memberof FromTransfer
*/
set currentVal(val: any) {
// const type: string = this.$util.typeOf(val);
// val =
// Object.is(type, "null") || Object.is(type, "undefined") ? undefined : val;
// this.dataLeft.forEach((elem: any) => {
// this.dataRight.forEach((item: any) => {
// if (elem.key === item) val.push(elem.value);
// });
// });
// val=val.join(',');
// this.$emit("change", val);
}
/** /**
* 获取值对象 * 获取值对象
* *
* @memberof FromTransfer * @memberof AppTransfer
*/ */
// get currentVal() {
// return this.itemValue;
// }
get currentVal() { get currentVal() {
return this.itemValue; return this.itemValue;
} }
...@@ -186,7 +164,7 @@ export default class FromTransfer extends Vue { ...@@ -186,7 +164,7 @@ export default class FromTransfer extends Vue {
* 代码表 * 代码表
* *
* @type {any[]} * @type {any[]}
* @memberof FromTransfer * @memberof AppTransfer
*/ */
// public items: any[] = []; // public items: any[] = [];
...@@ -195,7 +173,7 @@ export default class FromTransfer extends Vue { ...@@ -195,7 +173,7 @@ export default class FromTransfer extends Vue {
* *
* @param {*} arg * @param {*} arg
* @returns * @returns
* @memberof FromTransfer * @memberof AppTransfer
*/ */
public handlePublicParams(arg: any) { public handlePublicParams(arg: any) {
// 合并表单参数 // 合并表单参数
...@@ -225,11 +203,10 @@ export default class FromTransfer extends Vue { ...@@ -225,11 +203,10 @@ export default class FromTransfer extends Vue {
/** /**
* vue 生命周期 * vue 生命周期
* *
* @memberof FromTransfer * @memberof AppTransfer
*/ */
public created() { public created() {
this.dataHandle(); this.dataHandle();
this.initRight();
} }
/** /**
...@@ -241,7 +218,9 @@ export default class FromTransfer extends Vue { ...@@ -241,7 +218,9 @@ export default class FromTransfer extends Vue {
if (codelist) { if (codelist) {
this.dataLeft = [...JSON.parse(JSON.stringify(codelist.items))]; this.dataLeft = [...JSON.parse(JSON.stringify(codelist.items))];
this.initLeft(); this.initLeft();
this.initRight();
console.log(this.dataLeft); console.log(this.dataLeft);
console.log(this.dataRight);
} else { } else {
console.log(`----${this.tag}----代码表不存在`); console.log(`----${this.tag}----代码表不存在`);
} }
...@@ -257,8 +236,8 @@ export default class FromTransfer extends Vue { ...@@ -257,8 +236,8 @@ export default class FromTransfer extends Vue {
.then((res: any) => { .then((res: any) => {
this.dataLeft = res; this.dataLeft = res;
console.log(this.dataLeft); console.log(this.dataLeft);
this.initLeft(); this.initLeft();
this.initRight();
}) })
.catch((error: any) => { .catch((error: any) => {
console.log(`----${this.tag}----代码表不存在`); console.log(`----${this.tag}----代码表不存在`);
...@@ -286,9 +265,16 @@ export default class FromTransfer extends Vue { ...@@ -286,9 +265,16 @@ export default class FromTransfer extends Vue {
* 初始化右侧框数据 * 初始化右侧框数据
*/ */
public initRight() { public initRight() {
if (this.data) { let _data: string = this.data;
this.data.forEach((elem: any) => { console.log(_data);
this.dataRight.push(elem); if (_data) {
let newData: any[] = _data.split(",");
this.dataLeft.forEach((elem: any) => {
newData.forEach((item: any) => {
if (item === elem.value) {
this.dataRight.push(elem.key);
}
});
}); });
} }
} }
......
...@@ -178,6 +178,8 @@ ...@@ -178,6 +178,8 @@
]" ]"
:context="context" :context="context"
:viewparams="viewparams" :viewparams="viewparams"
:localContext ='{}'
:localParam ='{}'
parameterName='ibzemployee' parameterName='ibzemployee'
parentName="IBZEmployee" parentName="IBZEmployee"
refviewtype='DEGRIDVIEW' refviewtype='DEGRIDVIEW'
......
...@@ -47,6 +47,8 @@ ...@@ -47,6 +47,8 @@
]" ]"
:context="context" :context="context"
:viewparams="viewparams" :viewparams="viewparams"
:localContext ='{}'
:localParam ='{}'
parameterName='sysrole' parameterName='sysrole'
parentName="SysRole" parentName="SysRole"
refviewtype='DECUSTOMVIEW' refviewtype='DECUSTOMVIEW'
...@@ -83,6 +85,8 @@ ...@@ -83,6 +85,8 @@
]" ]"
:context="context" :context="context"
:viewparams="viewparams" :viewparams="viewparams"
:localContext ='{}'
:localParam ='{}'
parameterName='sysrole' parameterName='sysrole'
parentName="SysRole" parentName="SysRole"
refviewtype='DEGRIDVIEW' refviewtype='DEGRIDVIEW'
......
...@@ -30,6 +30,8 @@ ...@@ -30,6 +30,8 @@
]" ]"
:context="context" :context="context"
:viewparams="viewparams" :viewparams="viewparams"
:localContext ='{}'
:localParam ='{}'
parameterName='wfgroup' parameterName='wfgroup'
parentName="WFGroup" parentName="WFGroup"
refviewtype='DEGRIDVIEW' refviewtype='DEGRIDVIEW'
......
...@@ -37,6 +37,11 @@ ...@@ -37,6 +37,11 @@
git clone -b master $para2 ibzrt/ git clone -b master $para2 ibzrt/
export NODE_OPTIONS=--max-old-space-size=4096 export NODE_OPTIONS=--max-old-space-size=4096
cd ibzrt/ cd ibzrt/
mvn clean package -Pweb
cd ibzrt-app/ibzrt-app-web
mvn -Pweb docker:build
mvn -Pweb docker:push
docker -H $para1 stack deploy --compose-file=src/main/docker/ibzrt-app-web.yaml ibzlab-rt --with-registry-auth
</command> </command>
</hudson.tasks.Shell> </hudson.tasks.Shell>
</builders> </builders>
......
...@@ -9,6 +9,6 @@ CMD echo "The application will start in ${IBIZ_SLEEP}s..." && \ ...@@ -9,6 +9,6 @@ CMD echo "The application will start in ${IBIZ_SLEEP}s..." && \
sleep ${IBIZ_SLEEP} && \ sleep ${IBIZ_SLEEP} && \
java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /ibzrt-app-web.jar java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /ibzrt-app-web.jar
EXPOSE 8080 EXPOSE 30000
ADD ibzrt-app-web.jar /ibzrt-app-web.jar ADD ibzrt-app-web.jar /ibzrt-app-web.jar
...@@ -3,9 +3,21 @@ services: ...@@ -3,9 +3,21 @@ services:
ibzrt-app-web: ibzrt-app-web:
image: registry.cn-shanghai.aliyuncs.com/ibizsys/ibzrt-app-web:latest image: registry.cn-shanghai.aliyuncs.com/ibizsys/ibzrt-app-web:latest
ports: ports:
- "8080:8080" - "30000:30000"
networks: networks:
- agent_network - agent_network
environment:
- SPRING_CLOUD_NACOS_DISCOVERY_IP=172.16.180.237
- SERVER_PORT=30000
- SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR=172.16.102.211:8848
- SPRING_REDIS_HOST=172.16.100.243
- SPRING_REDIS_PORT=6379
- SPRING_REDIS_DATABASE=0
- SPRING_DATASOURCE_USERNAME=a_A_5d9d78509
- SPRING_DATASOURCE_PASSWORD=@6dEfb3@
- SPRING_DATASOURCE_URL=jdbc:mysql://172.16.180.232:3306/a_A_5d9d78509?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true
- SPRING_DATASOURCE_DRIVER-CLASS-NAME=com.mysql.jdbc.Driver
- SPRING_DATASOURCE_DEFAULTSCHEMA=a_A_5d9d78509
deploy: deploy:
resources: resources:
limits: limits:
......
...@@ -67,5 +67,9 @@ zuul: ...@@ -67,5 +67,9 @@ zuul:
path: /v7/login path: /v7/login
serviceId: ibzuaa-api serviceId: ibzuaa-api
stripPrefix: false stripPrefix: false
uaa:
path: /uaa/**
serviceId: ibzuaa-api
stripPrefix: false
sensitive-headers: sensitive-headers:
- Cookie,Set-Cookie,Authorization - Cookie,Set-Cookie,Authorization
...@@ -100,5 +100,9 @@ zuul: ...@@ -100,5 +100,9 @@ zuul:
path: /v7/login path: /v7/login
serviceId: ibzuaa-api serviceId: ibzuaa-api
stripPrefix: false stripPrefix: false
uaa:
path: /uaa/**
serviceId: ibzuaa-api
stripPrefix: false
sensitive-headers: sensitive-headers:
- Cookie,Set-Cookie,Authorization - Cookie,Set-Cookie,Authorization
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册