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

ibiz4j 发布系统代码

上级 1e9cca60
......@@ -26,7 +26,7 @@
"element-ui": "^2.13.0",
"file-saver": "^2.0.2",
"font-awesome": "^4.7.0",
"ibiz-gantt-elastic": "^1.0.16",
"ibiz-gantt-elastic": "^1.0.17",
"ibiz-vue-lib": "^0.1.10",
"interactjs": "^1.9.4",
"moment": "^2.24.0",
......
......@@ -28,21 +28,25 @@
<dropdown-menu slot='list' v-if="uiActionGroup.details && Array.isArray(uiActionGroup.details)">
<dropdown-item v-for="(detail,index) in (uiActionGroup.details)" :key="index" :name="detail.name">
<span class='item' @click="doUIAction($event, detail)">
<template v-if="detail.icon && !Object.is(detail.icon, '')">
<i :class="detail.icon" ></i>
</template>
<template v-if="!(detail.icon && !Object.is(detail.icon, ''))">
<div v-if="detail.img && !Object.is(detail.img, '')">
<img :src="detail.img" />
</div>
<template v-if="detail.isShowIcon">
<template v-if="detail.icon && !Object.is(detail.icon, '')">
<i :class="detail.icon" ></i>
</template>
<template v-if="!(detail.icon && !Object.is(detail.icon, ''))">
<div v-if="detail.img && !Object.is(detail.img, '')">
<img :src="detail.img" />
</div>
</template>
</template>
&nbsp;
<span>
<template v-if="uiActionGroup.langbase && !Object.is(uiActionGroup.langbase, '') && detail.uiactiontag && !Object.is(detail.uiactiontag, '')">
{{$t(`${uiActionGroup.langbase}.uiactions.${detail.uiactiontag}`)}}
</template>
<template v-if="!(uiActionGroup.langbase && !Object.is(uiActionGroup.langbase, '') && detail.uiactiontag && !Object.is(detail.uiactiontag, ''))">
{{detail.caption}}
<template v-if="detail.isShowCaption">
<template v-if="uiActionGroup.langbase && !Object.is(uiActionGroup.langbase, '') && detail.uiactiontag && !Object.is(detail.uiactiontag, '')">
{{$t(`${uiActionGroup.langbase}.uiactions.${detail.uiactiontag}`)}}
</template>
<template v-if="!(uiActionGroup.langbase && !Object.is(uiActionGroup.langbase, '') && detail.uiactiontag && !Object.is(detail.uiactiontag, ''))">
{{detail.caption}}
</template>
</template>
</span>
</span>
......@@ -55,21 +59,25 @@
<template v-if="uiActionGroup.details && Array.isArray(uiActionGroup.details)">
<div v-for="(detail,index) in uiActionGroup.details" :key="index">
<span class='item' @click="doUIAction($event, detail)">
<template v-if="detail.icon && !Object.is(detail.icon, '')">
<i :class="detail.icon" ></i>
</template>
<template v-if="!(detail.icon && !Object.is(detail.icon, ''))">
<div v-if="detail.img && !Object.is(detail.img, '')">
<img :src="detail.img" />
</div>
</template>
<template v-if="detail.isShowIcon">
<template v-if="detail.icon && !Object.is(detail.icon, '')">
<i :class="detail.icon" ></i>
</template>
<template v-if="!(detail.icon && !Object.is(detail.icon, ''))">
<div v-if="detail.img && !Object.is(detail.img, '')">
<img :src="detail.img" />
</div>
</template>
</template>
&nbsp;
<span>
<template v-if="uiActionGroup.langbase && !Object.is(uiActionGroup.langbase, '') && detail.uiactiontag && !Object.is(detail.uiactiontag, '')">
{{$t(`${uiActionGroup.langbase}.uiactions.${detail.uiactiontag}`)}}
</template>
<template v-if="!(uiActionGroup.langbase && !Object.is(uiActionGroup.langbase, '') && detail.uiactiontag && !Object.is(detail.uiactiontag, ''))">
{{detail.caption}}
<template v-if="detail.isShowCaption">
<template v-if="uiActionGroup.langbase && !Object.is(uiActionGroup.langbase, '') && detail.uiactiontag && !Object.is(detail.uiactiontag, '')">
{{$t(`${uiActionGroup.langbase}.uiactions.${detail.uiactiontag}`)}}
</template>
<template v-if="!(uiActionGroup.langbase && !Object.is(uiActionGroup.langbase, '') && detail.uiactiontag && !Object.is(detail.uiactiontag, ''))">
{{detail.caption}}
</template>
</template>
</span>
</span>
......
.ivu-select-dropdown {
padding: 0px;
.hidden {
display: none;
}
}
\ No newline at end of file
.transfer-select{
.ivu-select-dropdown {
padding: 0px;
.hidden {
display: none;
}
.el-transfer{
min-width: 100% !important;
display: flex;
justify-content: space-between;
.el-transfer-panel{
min-width: 25%;
}
.el-transfer__buttons{
align-self: center;
}
}
}
}
<template>
<Select
@on-open-change="transferRefresh"
@on-change="dataChange"
v-model="dataRight"
:style="{width:width?width:'586px'}"
multiple
>
<Option class="hidden" :value="item" v-for="(item,i) in dataRight" :key="i">{{findLabel(item)}}</Option>
<el-transfer v-model="dataRight" :data="dataLeft" @change="dataChange" :titles="['未选择', '已选择']"></el-transfer>
</Select>
<Select
class="transfer-select"
@on-open-change="transferRefresh"
@on-change="dataChange"
v-model="dataRight"
:style="{width:width}"
:disabled="disabled"
:placeholder="placeholder"
multiple>
<Option class="hidden" :value="item" v-for="(item,i) in dataRight" :key="i">
{{findLabel(item)}}
</Option>
<el-transfer
v-model="dataRight"
:data="dataLeft"
@change="dataChange"
:titles="['未选择', '已选择']"/>
</Select>
</template>
<script lang="ts">
import { Vue, Component, Watch, Prop, Model } from "vue-property-decorator";
import CodeListService from "@service/app/codelist-service";
......@@ -17,273 +26,270 @@ import { ElSelect } from "element-ui/types/select";
@Component({})
export default class AppTransfer extends Vue {
/**
* 传入表单数据
*
* @type {*}
* @memberof AppTransfer
*/
@Prop() public data:any;
/**
* 穿梭框宽度
*
* @type {*}
* @memberof AppTransfer
*/
@Prop() public width: any;
/**
* 穿梭框宽度
*
* @type {string}
* @memberof AppTransfer
*/
@Prop() public width?: string;
/**
* 表单传入字符串值分隔符
*
* @type {string}
* @memberof AppTransfer
*/
@Prop() public valueSeparator!: string;
/**
* 表单传入字符串值分隔符
*
* @type {string}
* @memberof AppTransfer
*/
@Prop() public valueSeparator?: string;
/**
* 当前选中值
* @type {any}
* @memberof AppTransfer
*/
@Model("change") public itemValue!: any;
/**
* 代码表标识
*
* @type {string}
* @memberof AppTransfer
*/
@Prop() public tag?: string;
/**
* 代码表标识
*
* @type {string}
* @memberof AppTransfer
*/
@Prop() public tag?: string;
/**
* 代码表类型
*
* @type {string}
* @memberof AppTransfer
*/
@Prop() public codelistType?: string;
/**
* 代码表类型
*
* @type {string}
* @memberof AppTransfer
*/
@Prop() public codelistType?: string;
/**
* 局部上下文导航参数
*
* @type {*}
* @memberof AppTransfer
*/
@Prop() public localContext!: any;
/**
* 局部上下文导航参数
*
* @type {*}
* @memberof AppTransfer
*/
@Prop() public localContext!: any;
/**
* 局部导航参数
*
* @type {*}
* @memberof AppTransfer
*/
@Prop() public localParam!: any;
/**
* 局部导航参数
*
* @type {*}
* @memberof AppTransfer
*/
@Prop() public localParam!: any;
/**
* 视图上下文
*
* @type {*}
* @memberof AppAutocomplete
*/
@Prop() public context!: any;
/**
* 视图上下文
*
* @type {*}
* @memberof AppAutocomplete
*/
@Prop() public context!: any;
/**
* 视图参数
*
* @type {*}
* @memberof AppFormDRUIPart
*/
@Prop() public viewparams!: any;
/**
* 视图参数
*
* @type {*}
* @memberof AppFormDRUIPart
*/
@Prop() public viewparams!: any;
/**
* 是否禁用
*
* @type {any}
* @memberof AppTransfer
*
*/
@Prop() public disabled?: any;
/**
* 是否禁用
*
* @type {any}
* @memberof AppTransfer
*
*/
@Prop() public disabled?: any;
/**
* 穿梭框提示内容
*
* @type {string}
* @memberof AppTransfer
*/
@Prop() public placeholder?: string;
/**
* placeholder
*
* @type {string}
* @memberof AppTransfer
*
*/
@Prop() public placeholder?: string;
/**
* 当前选中值
*
* @type {any}
* @memberof AppTransfer
*/
@Model("change") public itemValue!: any;
/**
* 左侧框数据
*
* @type {any[]}
* @memberof AppTransfer
*/
public dataLeft: any[] = [];
/**
* 左侧框数据
*
* @memberof AppTransfer
*/
public dataLeft: any[] = [];
/**
* 右侧框数据
*
* @type {any[]}
* @memberof AppTransfer
*/
public dataRight: any[] = [];
/**
* 右侧框数据
*
* @memberof AppTransfer
*/
public dataRight: any[] = [];
/**
* 代码表服务对象
*
* @type {CodeListService}
* @memberof AppTransfer
*/
/**
* 代码表服务对象
*
* @type {CodeListService}
* @memberof AppTransfer
*/
public codeListService: CodeListService = new CodeListService({
$store: this.$store
});
public codeListService: CodeListService = new CodeListService({$store: this.$store});
/**
* vue 生命周期
* @memberof AppTransfer
*/
public created() {
this.dataHandle();
}
/**
* vue 生命周期
*
* @memberof AppTransfer
*/
public created() {
this.dataHandle();
}
/**
* 数据处理
*
* @memberof AppTransfer
*/
public dataHandle() {
if (this.tag && Object.is(this.codelistType, "STATIC")) {
const codelist = this.$store.getters.getCodeList(this.tag);
if (codelist) {
this.dataLeft = [...JSON.parse(JSON.stringify(codelist.items))];
this.initData()
} else {
console.log(`----${this.tag}----代码表不存在`);
}
} else if (this.tag && Object.is(this.codelistType, "DYNAMIC")) {
// 处理公共参数
let data: any = {};
this.handlePublicParams(data);
// 参数处理
let _context = data.context;
let _param = data.param;
this.codeListService
.getItems(this.tag, _context, _param)
.then((res: any) => {
this.dataLeft = res;
this.initData()
})
.catch((error: any) => {
console.log(`----${this.tag}----代码表不存在`);
});
}
}
/**
* 组件change事件,右侧框数据变化时
*
* @memberof AppTransfer
*/
dataChange(e: any) {
let _valueSeparator: string = this.initValueSeparator();
let newVal: string = e.join(`${_valueSeparator}`);
if (newVal) {
this.$emit("change", newVal);
} else {
this.$emit("change", null);
/**
* 公共参数处理
*
* @param {*} arg
* @returns
* @memberof AppTransfer
*/
public handlePublicParams(arg: any) {
// 合并表单参数
arg.param = this.viewparams? JSON.parse(JSON.stringify(this.viewparams)): {};
arg.context = this.context ? JSON.parse(JSON.stringify(this.context)) : {};
// 附加参数处理
if (this.localContext && Object.keys(this.localContext).length > 0) {
let _context = this.$util.computedNavData(this.data,arg.context,arg.param,this.localContext);
Object.assign(arg.context, _context);
}
if (this.localParam && Object.keys(this.localParam).length > 0) {
let _param = this.$util.computedNavData(this.data,arg.context,arg.param,this.localParam);
Object.assign(arg.param, _param);
}
}
}
/**
* 初始化valueSeparator
*
* @memberof AppTransfer
*/
public initValueSeparator() {
return this.valueSeparator?this.valueSeparator:",";
}
/**
* 初始化获取到的选项数据
*
* @memberof AppTransfer
*/
public initData(){
// 初始化左侧框数据
let left: any[] = [];
Object.assign(left, this.dataLeft);
this.dataLeft = [];
left.forEach((elem: any, i: any) => {
this.dataLeft.push({
key: elem.id,
value: elem.value,
label: elem.text,
disabled: elem.disabled
});
});
/**
* 数据处理
*
* @memberof AppTransfer
*/
public dataHandle() {
if (this.tag && Object.is(this.codelistType, "STATIC")) {
const codelist = this.$store.getters.getCodeList(this.tag);
if (codelist) {
this.dataLeft = [...JSON.parse(JSON.stringify(codelist.items))];
this.initLeft();
this.initRight();
} else {
console.log(`----${this.tag}----代码表不存在`);
}
} else if (this.tag && Object.is(this.codelistType, "DYNAMIC")) {
// 处理公共参数
let data: any = {};
this.handlePublicParams(data);
// 参数处理
let _context = data.context;
let _param = data.param;
this.codeListService.getItems(this.tag, _context, _param).then((res: any) => {
this.dataLeft = res;
this.initLeft();
this.initRight();
}).catch((error: any) => {
console.log(`----${this.tag}----代码表不存在`);
// 初始化右侧框数据
let _valueSeparator: any;
_valueSeparator = this.initValueSeparator();
let _data: any = this.itemValue;
if (_data) {
let _dataRight: any = [];
let newData: any[] = _data.split(`${_valueSeparator}`);
this.dataLeft.forEach((elem: any) => {
newData.forEach((item: any) => {
if (item === elem.value) {
_dataRight.push(elem.key);
}
});
});
this.dataRight = _dataRight;
}
}
}
/**
* 公共参数处理
*
* @param {*} arg
* @returns
* @memberof AppTransfer
*/
public handlePublicParams(arg: any) {
// 合并表单参数
arg.param = this.viewparams? JSON.parse(JSON.stringify(this.viewparams)): {};
arg.context = this.context ? JSON.parse(JSON.stringify(this.context)) : {};
// 附加参数处理
if (this.localContext && Object.keys(this.localContext).length > 0) {
let _context = this.$util.computedNavData(this.itemValue,arg.context,arg.param,this.localContext);
Object.assign(arg.context, _context);
/**
* 组件change事件,右侧框数据变化时
* @memberof AppTransfer
*/
public dataChange(e: any) {
let _valueSeparator: string;
_valueSeparator = this.initValueSeparator();
let newVal: string = e.join(`${_valueSeparator}`);
if (newVal) {
this.$emit("change", newVal);
} else {
this.$emit("change", null);
}
}
if (this.localParam && Object.keys(this.localParam).length > 0) {
let _param = this.$util.computedNavData(this.itemValue,arg.context,arg.param,this.localParam);
Object.assign(arg.param, _param);
}
}
/**
* 初始化左侧框数据
*
* @memberof AppTransfer
*/
public initLeft() {
let left: any[] = [];
Object.assign(left, this.dataLeft);
this.dataLeft = [];
left.forEach((elem: any, i: any) => {
this.dataLeft.push({
key: elem.id,
value: elem.value,
label: elem.text,
disabled: elem.disabled
});
});
}
/**
* 初始化右侧框数据
*
* @memberof AppTransfer
*/
public initRight() {
let _valueSeparator: any;
_valueSeparator = this.initValueSeparator();
let _data: any = this.itemValue;
if (_data) {
let _dataRight: any = [];
let newData: any[] = _data.split(`${_valueSeparator}`);
this.dataLeft.forEach((elem: any) => {
newData.forEach((item: any) => {
if (item === elem.value) {
_dataRight.push(elem.key);
}
});
});
this.dataRight = _dataRight;
/**
* 初始化valueSeparator
* @memberof AppTransfer
*/
public initValueSeparator() {
return this.valueSeparator ? this.valueSeparator : ",";
}
}
/**
* 穿梭框打开时刷新数据
*
* @memberof AppTransfer
*/
public transferRefresh(e: any) {
if (e && this.codelistType === "DYNAMIC") {
this.dataLeft = [];
this.dataHandle();
/**
* 穿梭框打开时刷新数据
* @memberof AppTransfer
*/
public transferRefresh(e: boolean) {
if (e && this.codelistType === "DYNAMIC") {
this.dataLeft = [];
this.dataHandle();
}
}
}
/**
* 找到dataLeft中key与dataRight中item相等的元素,返回label
*
* @memberof AppTransfer
*/
public findLabel(item: any) {
for (const elem of this.dataLeft) {
if (elem.key === item) return elem.label;
/**
* 找到dataLeft中key与dataRight中item相等的元素,返回label
* @memberof AppTransfer
*/
public findLabel(item: any) {
for (const elem of this.dataLeft) {
if (elem.key === item) return elem.label;
}
}
}
}
</script>
......
......@@ -5238,10 +5238,10 @@ human-signals@^1.1.1:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
ibiz-gantt-elastic@^1.0.16:
version "1.0.16"
resolved "https://registry.npm.taobao.org/ibiz-gantt-elastic/download/ibiz-gantt-elastic-1.0.16.tgz#e2de7e8d4bdb3c292cfbc97c4f970c8ecfe6c43b"
integrity sha1-4t5+jUvbPCks+8l8T5cMjs/mxDs=
ibiz-gantt-elastic@^1.0.17:
version "1.0.17"
resolved "https://registry.yarnpkg.com/ibiz-gantt-elastic/-/ibiz-gantt-elastic-1.0.17.tgz#447cce5db2e0127d2336c20370fc251992520c6f"
integrity sha512-AJOYXZGM020wafn60RJLM2yKmtT2BjCpBKkZ0PONcxdqW/kCyXOqEo3c3/PBtFEkJx/8KGTayB013BOdGI1+uQ==
dependencies:
dayjs "^1.8.16"
resize-observer-polyfill "^1.5.1"
......
......@@ -7,6 +7,7 @@ import java.util.Map;
import java.math.BigInteger;
import java.util.HashMap;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
......@@ -25,7 +26,6 @@ import org.springframework.data.annotation.Transient;
/**
* [应用] 对象
*/
@Builder
@Getter
@Setter
@NoArgsConstructor
......@@ -109,7 +109,6 @@ public class SysApp extends EntityBase implements Serializable {
}
......@@ -7,6 +7,7 @@ import java.util.Map;
import java.math.BigInteger;
import java.util.HashMap;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
......@@ -114,6 +115,7 @@ public class SysAuthLog extends EntityMP implements Serializable {
this.username = username ;
this.modify("username",username);
}
/**
* 设置 [用户名称]
*/
......@@ -121,6 +123,7 @@ public class SysAuthLog extends EntityMP implements Serializable {
this.personname = personname ;
this.modify("personname",personname);
}
/**
* 设置 [域]
*/
......@@ -128,6 +131,7 @@ public class SysAuthLog extends EntityMP implements Serializable {
this.domain = domain ;
this.modify("domain",domain);
}
/**
* 设置 [IP地址]
*/
......@@ -135,6 +139,7 @@ public class SysAuthLog extends EntityMP implements Serializable {
this.ipaddr = ipaddr ;
this.modify("ipaddr",ipaddr);
}
/**
* 设置 [MAC地址]
*/
......@@ -142,6 +147,7 @@ public class SysAuthLog extends EntityMP implements Serializable {
this.macaddr = macaddr ;
this.modify("macaddr",macaddr);
}
/**
* 设置 [客户端]
*/
......@@ -149,6 +155,7 @@ public class SysAuthLog extends EntityMP implements Serializable {
this.useragent = useragent ;
this.modify("useragent",useragent);
}
/**
* 设置 [认证结果]
*/
......@@ -157,6 +164,7 @@ public class SysAuthLog extends EntityMP implements Serializable {
this.modify("authcode",authcode);
}
}
......@@ -7,6 +7,7 @@ import java.util.Map;
import java.math.BigInteger;
import java.util.HashMap;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
......@@ -105,6 +106,7 @@ public class SysPermission extends EntityMP implements Serializable {
this.permissionname = permissionname ;
this.modify("sys_permissionname",permissionname);
}
/**
* 设置 [资源类别]
*/
......@@ -112,6 +114,7 @@ public class SysPermission extends EntityMP implements Serializable {
this.permissiontype = permissiontype ;
this.modify("permissiontype",permissiontype);
}
/**
* 设置 [系统]
*/
......@@ -120,6 +123,7 @@ public class SysPermission extends EntityMP implements Serializable {
this.modify("pssystemid",pssystemid);
}
}
......@@ -7,6 +7,7 @@ import java.util.Map;
import java.math.BigInteger;
import java.util.HashMap;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
......@@ -89,6 +90,7 @@ public class SysRole extends EntityMP implements Serializable {
this.rolename = rolename ;
this.modify("sys_rolename",rolename);
}
/**
* 设置 [备注]
*/
......@@ -97,6 +99,7 @@ public class SysRole extends EntityMP implements Serializable {
this.modify("memo",memo);
}
}
......@@ -7,6 +7,7 @@ import java.util.Map;
import java.math.BigInteger;
import java.util.HashMap;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
......@@ -134,6 +135,7 @@ public class SysRolePermission extends EntityMP implements Serializable {
this.roleid = roleid ;
this.modify("sys_roleid",roleid);
}
/**
* 设置 [权限表标识]
*/
......@@ -142,6 +144,7 @@ public class SysRolePermission extends EntityMP implements Serializable {
this.modify("sys_permissionid",permissionid);
}
/**
* 获取 [角色权限关系表标识]
*/
......
......@@ -7,6 +7,7 @@ import java.util.Map;
import java.math.BigInteger;
import java.util.HashMap;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
......@@ -77,6 +78,7 @@ public class SysUser extends EntityMP implements Serializable {
this.username = username ;
this.modify("username",username);
}
/**
* 设置 [用户姓名]
*/
......@@ -84,6 +86,7 @@ public class SysUser extends EntityMP implements Serializable {
this.personname = personname ;
this.modify("personname",personname);
}
/**
* 设置 [密码]
*/
......@@ -92,6 +95,7 @@ public class SysUser extends EntityMP implements Serializable {
this.modify("password",password);
}
}
......@@ -7,6 +7,7 @@ import java.util.Map;
import java.math.BigInteger;
import java.util.HashMap;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
......@@ -120,6 +121,7 @@ public class SysUserRole extends EntityMP implements Serializable {
this.roleid = roleid ;
this.modify("sys_roleid",roleid);
}
/**
* 设置 [用户标识]
*/
......@@ -128,6 +130,7 @@ public class SysUserRole extends EntityMP implements Serializable {
this.modify("sys_userid",userid);
}
/**
* 获取 [用户角色关系标识]
*/
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册