Commit 0afaa722 by crushh

update: dist

parents c9d09b17 0ad12649
<!DOCTYPE html><html><head><meta charset=utf-8><link rel="shortcut icon" href=./favicon.ico><title>好办管理平台</title><link rel=stylesheet type=text/css href=//web-1251519181.file.myqcloud.com/custom-element/custom-element.1.0.76.css><script src=//at.alicdn.com/t/font_1628375_vcg1gtmx7lb.js></script><link rel=stylesheet href=//at.alicdn.com/t/font_2859043_udehp133w1.css><link rel="shortcut icon" href=./favicon.ico><link href=./static/css/app.c1f8c14b52ac982f7d1827fa9d006782.css rel=stylesheet></head><body class=damolish><div id=app></div><script>(function() {
<!DOCTYPE html><html><head><meta charset=utf-8><link rel="shortcut icon" href=./favicon.ico><title>好办管理平台</title><link rel=stylesheet type=text/css href=//web-1251519181.file.myqcloud.com/custom-element/custom-element.1.0.76.css><script src=//at.alicdn.com/t/font_1628375_vcg1gtmx7lb.js></script><link rel=stylesheet href=//at.alicdn.com/t/font_2859043_udehp133w1.css><link rel="shortcut icon" href=./favicon.ico><link href=./static/css/app.737fdd06d5408e520fc373e25c0c0e2a.css rel=stylesheet></head><body class=damolish><div id=app></div><script>(function() {
var src = '/component/static/import-component.js?timestrap='+ new Date().getTime();
var host = window.location.host;
host = host.indexOf('localhost') > -1 || host.indexOf('192.168') > -1 ? 'www.gicdev.com' : host;
document.write('<script src="//'+ host + src +'"><\/script>')
})()</script><script src=//web-1251519181.file.myqcloud.com/components/pagination.1.0.10.js></script><script src=//web-1251519181.file.myqcloud.com/components/common.1.0.3.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-data.1.0.11.js></script><script type=text/javascript src=./static/js/manifest.413c92db249ee06f2fbc.js></script><script type=text/javascript src=./static/js/vendor.96dfd34847898b688720.js></script><script type=text/javascript src=./static/js/app.6febd5238a73e3fcf5aa.js></script></body></html>
\ No newline at end of file
})()</script><script src=//web-1251519181.file.myqcloud.com/components/pagination.1.0.10.js></script><script src=//web-1251519181.file.myqcloud.com/components/common.1.0.3.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-data.1.0.11.js></script><script type=text/javascript src=./static/js/manifest.ada270c0fd62a88f65e0.js></script><script type=text/javascript src=./static/js/vendor.96dfd34847898b688720.js></script><script type=text/javascript src=./static/js/app.13d1b3590e2ff35f389e.js></script></body></html>
\ No newline at end of file
!function(e){var f=window.webpackJsonp;window.webpackJsonp=function(a,b,n){for(var r,t,o,i=0,u=[];i<a.length;i++)t=a[i],c[t]&&u.push(c[t][0]),c[t]=0;for(r in b)Object.prototype.hasOwnProperty.call(b,r)&&(e[r]=b[r]);for(f&&f(a,b,n);u.length;)u.shift()();if(n)for(i=0;i<n.length;i++)o=d(d.s=n[i]);return o};var a={},c={127:0};function d(f){if(a[f])return a[f].exports;var c=a[f]={i:f,l:!1,exports:{}};return e[f].call(c.exports,c,c.exports,d),c.l=!0,c.exports}d.e=function(e){var f=c[e];if(0===f)return new Promise(function(e){e()});if(f)return f[2];var a=new Promise(function(a,d){f=c[e]=[a,d]});f[2]=a;var b=document.getElementsByTagName("head")[0],n=document.createElement("script");n.type="text/javascript",n.charset="utf-8",n.async=!0,n.timeout=12e4,d.nc&&n.setAttribute("nonce",d.nc),n.src=d.p+"static/js/"+e+"."+{0:"1016cf60ded6c62342db",1:"fd15a7f381f3fc4a55fe",2:"faa3f58faff392d74bbb",3:"cf88d56554ebd1b98880",4:"f48e99bcbd5757fd7f21",5:"9caf2662daa480edc216",6:"3c172bbe63c787742f4c",7:"04b6a76259d8e9d97f6f",8:"a37aef2f26a78d7085dd",9:"ccdd5ef4287324da425a",10:"0c309eceb04d492e8695",11:"c8269a6ce3166c2baddb",12:"62aacaf39a18c9d0c559",13:"af8dbda8aead2733f959",14:"34ac983117b5d6440647",15:"9d0d587ff1c54fd27ed2",16:"03efbc3fd86def29dffe",17:"bea90e10f3e91e59fb36",18:"edc7a426bdab510f497a",19:"13396f66eabc204faf54",20:"b2063783bda9d1a2361e",21:"11826617f80c3d124999",22:"ed2d87a3b61cb1bcd405",23:"33ace7a5fc24922ae259",24:"f4f5fbc8a0755d988763",25:"f0488296b7e86a8c6ef0",26:"9bcaea2d90c17205d28d",27:"aeef277e50f51aee1062",28:"29c7f2707ca85abf0017",29:"609b38a8c86e6e684f01",30:"4056b61db48119d2a1c2",31:"a634530c09ea9f7e0d75",32:"643c90b3b9a7d1c50a25",33:"7905d75f9175f609d621",34:"6bc9f5faa99efb8fd2e9",35:"46083964a212c678907a",36:"3a5599a16aac7937e555",37:"850afd86dcf45b00c297",38:"01bc0f8f23d0731dda44",39:"c77317bde6a560f384ce",40:"a21604896caab2ce2991",41:"5aaff40d52d018b1d342",42:"4c5c6fb596a3a580d5e6",43:"8fd4c4cc5cbfefdef418",44:"6b085ba5eccd8e026fb4",45:"ccba0860f1d79740cbfe",46:"8c5af0d05d98b6e7f672",47:"d40cbe8899a76e2b13dd",48:"9f17d9a314a70880c83b",49:"55ed36c94931276ccedd",50:"480dab4ae9e1e775459c",51:"cb35a36da37fff01aebf",52:"d011bbf6eb68b0afe482",53:"5eb6577a05917a822fa5",54:"000e875fc44a37d1bffa",55:"b6e727b20fb3f6b2db14",56:"97ccee7ced4746e51568",57:"f65318474f9d86cf98a3",58:"7eb9b5cd2237002868a5",59:"7f512eb01d2e429c2476",60:"e6b9c65ce37c1929ba43",61:"e4069c16ebc689b0dc37",62:"08c93fc8b5cec569384e",63:"0cc4b18a26aae449bca8",64:"8d2437cad744ac931b05",65:"eba6f55d8e9a3f5f1556",66:"4ff9b01f9f65e8d72911",67:"2ad7878ba5300bbb2075",68:"6ede6fc15f1a70e4d43e",69:"d94655bd1519e3531e92",70:"808db550f342fbfe1d67",71:"766bab0863a53aeb3841",72:"44f1e5c579e6a918563f",73:"40d5effce4dd1d610bae",74:"d2df8a125f082781388a",75:"2c7a9137991f6fac666f",76:"6fa5a4895a9b645af850",77:"3755e506e2e6ccb2f4e0",78:"e4261d251a8566c89c9e",79:"c367f2170b933640c5fb",80:"b4da3a16a49aa7dec44c",81:"ed9f776c33449e4502f5",82:"f1f0b8be9fe8c0a48f49",83:"c298352267668f8595b9",84:"3a3d94cb0710361148ba",85:"e5439abe451416c8a344",86:"20cd7c44d2dce9b99ead",87:"c168a76e32bf6449fedb",88:"14fe0fab15433b4cde0f",89:"f57a97e9db4579af197d",90:"1563292e4aeb4451bb57",91:"cb219ccb86704f454c6c",92:"b8b28f280177a918217c",93:"c2f6f864a42a2ba094b6",94:"a05808a19c93cf45844a",95:"1cd2779682b88f36cc44",96:"2608b94dc3560dd462cc",97:"286de4a55de4f21aefa4",98:"f395537903ef38a74302",99:"56bd214ee9e9f47d1319",100:"8cd690fd2c3b369ca997",101:"e9b064951e0bd2ac4fc1",102:"6266585ead51278628b3",103:"f365ce110e2febef23d2",104:"7ddd6d683f54c5c651e4",105:"dd7cffff77160083ac84",106:"360b805cc2bdec5f62f8",107:"666d576bb039b61dfed5",108:"26497aa6b68d1990d2b5",109:"9d53d6f7cda3a99ed217",110:"7f2acc61341dfb31cc16",111:"f904f0da7f8b566254f2",112:"8de9fb6d574ec5e1563a",113:"327231106e788fa15be9",114:"ff12a943c23c0f590d98",115:"ce4969a4fb2eec09fb34",116:"876d6cbfd9ba3b20e6a3",117:"579a3852194611d7f74f",118:"21e29512096ca553a970",119:"b3a1ae7697da88feebe9",120:"88735ccd1c5ad39b0619",121:"e6c2472082fd34715888",122:"f198a229d799225c8247",123:"e04284f495f670fd6bd7",124:"29147952d0ffef007ae9"}[e]+".js";var r=setTimeout(t,12e4);function t(){n.onerror=n.onload=null,clearTimeout(r);var f=c[e];0!==f&&(f&&f[1](new Error("Loading chunk "+e+" failed.")),c[e]=void 0)}return n.onerror=n.onload=t,b.appendChild(n),a},d.m=e,d.c=a,d.d=function(e,f,a){d.o(e,f)||Object.defineProperty(e,f,{configurable:!1,enumerable:!0,get:a})},d.n=function(e){var f=e&&e.__esModule?function(){return e.default}:function(){return e};return d.d(f,"a",f),f},d.o=function(e,f){return Object.prototype.hasOwnProperty.call(e,f)},d.p="./",d.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
!function(e){var f=window.webpackJsonp;window.webpackJsonp=function(a,b,n){for(var r,t,o,i=0,u=[];i<a.length;i++)t=a[i],c[t]&&u.push(c[t][0]),c[t]=0;for(r in b)Object.prototype.hasOwnProperty.call(b,r)&&(e[r]=b[r]);for(f&&f(a,b,n);u.length;)u.shift()();if(n)for(i=0;i<n.length;i++)o=d(d.s=n[i]);return o};var a={},c={127:0};function d(f){if(a[f])return a[f].exports;var c=a[f]={i:f,l:!1,exports:{}};return e[f].call(c.exports,c,c.exports,d),c.l=!0,c.exports}d.e=function(e){var f=c[e];if(0===f)return new Promise(function(e){e()});if(f)return f[2];var a=new Promise(function(a,d){f=c[e]=[a,d]});f[2]=a;var b=document.getElementsByTagName("head")[0],n=document.createElement("script");n.type="text/javascript",n.charset="utf-8",n.async=!0,n.timeout=12e4,d.nc&&n.setAttribute("nonce",d.nc),n.src=d.p+"static/js/"+e+"."+{0:"1016cf60ded6c62342db",1:"fd15a7f381f3fc4a55fe",2:"faa3f58faff392d74bbb",3:"cf88d56554ebd1b98880",4:"f48e99bcbd5757fd7f21",5:"d0312de2de3033303468",6:"9d5b7e4c42365e5bc4b9",7:"04b6a76259d8e9d97f6f",8:"a37aef2f26a78d7085dd",9:"ccdd5ef4287324da425a",10:"0c309eceb04d492e8695",11:"c8269a6ce3166c2baddb",12:"62aacaf39a18c9d0c559",13:"af8dbda8aead2733f959",14:"34ac983117b5d6440647",15:"9d0d587ff1c54fd27ed2",16:"03efbc3fd86def29dffe",17:"bea90e10f3e91e59fb36",18:"edc7a426bdab510f497a",19:"13396f66eabc204faf54",20:"b2063783bda9d1a2361e",21:"11826617f80c3d124999",22:"ed2d87a3b61cb1bcd405",23:"33ace7a5fc24922ae259",24:"f4f5fbc8a0755d988763",25:"f0488296b7e86a8c6ef0",26:"9bcaea2d90c17205d28d",27:"aeef277e50f51aee1062",28:"29c7f2707ca85abf0017",29:"609b38a8c86e6e684f01",30:"4056b61db48119d2a1c2",31:"a634530c09ea9f7e0d75",32:"643c90b3b9a7d1c50a25",33:"7905d75f9175f609d621",34:"6bc9f5faa99efb8fd2e9",35:"46083964a212c678907a",36:"3a5599a16aac7937e555",37:"850afd86dcf45b00c297",38:"01bc0f8f23d0731dda44",39:"c77317bde6a560f384ce",40:"a21604896caab2ce2991",41:"5aaff40d52d018b1d342",42:"4c5c6fb596a3a580d5e6",43:"8fd4c4cc5cbfefdef418",44:"6b085ba5eccd8e026fb4",45:"ccba0860f1d79740cbfe",46:"8c5af0d05d98b6e7f672",47:"d40cbe8899a76e2b13dd",48:"9f17d9a314a70880c83b",49:"55ed36c94931276ccedd",50:"480dab4ae9e1e775459c",51:"cb35a36da37fff01aebf",52:"d011bbf6eb68b0afe482",53:"5eb6577a05917a822fa5",54:"000e875fc44a37d1bffa",55:"b6e727b20fb3f6b2db14",56:"97ccee7ced4746e51568",57:"f65318474f9d86cf98a3",58:"7eb9b5cd2237002868a5",59:"7f512eb01d2e429c2476",60:"e6b9c65ce37c1929ba43",61:"e4069c16ebc689b0dc37",62:"08c93fc8b5cec569384e",63:"0cc4b18a26aae449bca8",64:"8d2437cad744ac931b05",65:"eba6f55d8e9a3f5f1556",66:"4ff9b01f9f65e8d72911",67:"2ad7878ba5300bbb2075",68:"6ede6fc15f1a70e4d43e",69:"d94655bd1519e3531e92",70:"808db550f342fbfe1d67",71:"766bab0863a53aeb3841",72:"44f1e5c579e6a918563f",73:"40d5effce4dd1d610bae",74:"d2df8a125f082781388a",75:"2c7a9137991f6fac666f",76:"6fa5a4895a9b645af850",77:"3755e506e2e6ccb2f4e0",78:"e4261d251a8566c89c9e",79:"c367f2170b933640c5fb",80:"b4da3a16a49aa7dec44c",81:"ed9f776c33449e4502f5",82:"f1f0b8be9fe8c0a48f49",83:"c298352267668f8595b9",84:"3a3d94cb0710361148ba",85:"e5439abe451416c8a344",86:"20cd7c44d2dce9b99ead",87:"c168a76e32bf6449fedb",88:"14fe0fab15433b4cde0f",89:"f57a97e9db4579af197d",90:"1563292e4aeb4451bb57",91:"cb219ccb86704f454c6c",92:"b8b28f280177a918217c",93:"c2f6f864a42a2ba094b6",94:"a05808a19c93cf45844a",95:"1cd2779682b88f36cc44",96:"2608b94dc3560dd462cc",97:"286de4a55de4f21aefa4",98:"f395537903ef38a74302",99:"56bd214ee9e9f47d1319",100:"8cd690fd2c3b369ca997",101:"e9b064951e0bd2ac4fc1",102:"6266585ead51278628b3",103:"f365ce110e2febef23d2",104:"7ddd6d683f54c5c651e4",105:"dd7cffff77160083ac84",106:"360b805cc2bdec5f62f8",107:"666d576bb039b61dfed5",108:"26497aa6b68d1990d2b5",109:"9d53d6f7cda3a99ed217",110:"7f2acc61341dfb31cc16",111:"f904f0da7f8b566254f2",112:"8de9fb6d574ec5e1563a",113:"327231106e788fa15be9",114:"ff12a943c23c0f590d98",115:"ce4969a4fb2eec09fb34",116:"876d6cbfd9ba3b20e6a3",117:"579a3852194611d7f74f",118:"21e29512096ca553a970",119:"b3a1ae7697da88feebe9",120:"88735ccd1c5ad39b0619",121:"e6c2472082fd34715888",122:"f198a229d799225c8247",123:"e04284f495f670fd6bd7",124:"29147952d0ffef007ae9"}[e]+".js";var r=setTimeout(t,12e4);function t(){n.onerror=n.onload=null,clearTimeout(r);var f=c[e];0!==f&&(f&&f[1](new Error("Loading chunk "+e+" failed.")),c[e]=void 0)}return n.onerror=n.onload=t,b.appendChild(n),a},d.m=e,d.c=a,d.d=function(e,f,a){d.o(e,f)||Object.defineProperty(e,f,{configurable:!1,enumerable:!0,get:a})},d.n=function(e){var f=e&&e.__esModule?function(){return e.default}:function(){return e};return d.d(f,"a",f),f},d.o=function(e,f){return Object.prototype.hasOwnProperty.call(e,f)},d.p="./",d.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
<template>
<div class="expire-alert-box">
<el-dialog title="接口许可证即将到期" :visible.sync="visible" width="600px" @close="onClose">
<div class="label">企微企业名称:{{ expireData.corpName }}</div>
<div class="label">品牌名称:{{ expireData.enterpriseNames }}</div>
<div class="label">到期时间:{{ expireData.interceptTime | timeStampToYmd3 }}</div>
<div class="label" v-if="interceptTimeNew > 0">
企业微信自2022年5月16日起,面对服务商进行平台收费模式调整,服务商需接入接口收费模式,购买并激活接口调用许可后,才可使用企业微信接口;<span>{{ expireData.interceptTimeNew }}</span>后将有<span>{{ expireData.interceptUserNum }}</span
>个接口许可证即将过期,您总共还剩余<span>{{ expireData.permissionUserNum }}</span
>个可用的接口许可证,请保证数量充足,如需增加请及时联系运营人员续费,避免影响使用;
</div>
<div class="label" v-else>
企业微信自2022年5月16日起,面对服务商进行平台收费模式调整,服务商需接入接口收费模式,购买并激活接口调用许可后,才可使用企业微信接口;<span>今日{{ expireData.interceptTime | timeStampToHms }}</span
>后将有<span>{{ expireData.interceptUserNum }}</span
>个接口许可证即将过期,您总共还剩余<span>{{ expireData.permissionUserNum }}</span
>个可用的接口许可证,请保证数量充足,如需增加请及时联系运营人员续费,避免影响使用;
</div>
<el-row type="flex" justify="end" align="middle" style="margin: 14px 0;">
<el-button @click="onClose">知道了</el-button>
</el-row>
</el-dialog>
</div>
</template>
<script>
export default {
name: 'ExpireDialog',
data() {
return {};
},
props: {
expireData: {},
visible: false
},
methods: {
onClose() {
let now = new Date().getTime();
sessionStorage.setItem('permission-interceptor-time', now);
this.$emit('update:visible', false);
}
}
// filters: {
// formatDate(value) {
// if (!value) {
// return '';
// }
// let arr = value.split(' ');
// let arr1 = arr[0].split('-');
// return `${arr1[0]}年${parseInt(arr1[1])}月${parseInt(arr1[2])}日`;
// }
// }
};
</script>
<style lang="scss">
.expire-alert-box .el-dialog {
background-repeat: no-repeat;
background-image: url('../images/alert_bg.png') !important;
background-size: 100% 177px;
padding: 0 10px;
}
</style>
<style lang="scss" scoped>
.label {
color: #303133;
font-size: 14px;
padding-bottom: 10px;
line-height: 20px;
}
.label span {
color: #f5222d;
}
.sub-enterprise-box {
border-radius: 4px;
background: #f7f8fa;
margin-bottom: 16px;
}
.sub-enterprise-box .cell {
padding: 10px 12px;
color: #303133;
font-size: 14px;
}
.sub-enterprise-box .line {
height: 1px;
border-bottom: 1px dashed #dcdfe6;
box-sizing: border-box;
margin: 0 22px 0 12px;
}
</style>
......@@ -11,6 +11,7 @@
</keep-alive>
</div>
</div>
<expire-dialog :visible.sync="showExpireDialog" :expireData="expireData"></expire-dialog>
</div>
</template>
......@@ -21,10 +22,12 @@ import errorMsg from '@/common/js/error.js';
import MainMenu from './main-menu.vue';
import AsideMenu from './aside-menu.vue';
import BreadMenu from './bread-menu.vue';
import filters from '@/filters/index.js';
import ExpireDialog from './components/expire-dialog.vue';
let provideData = { layoutVm: {} };
export default {
name: 'DmHbLayout',
components: { Notice, MainMenu, AsideMenu, BreadMenu },
components: { Notice, MainMenu, AsideMenu, BreadMenu, ExpireDialog },
provide: () => provideData,
props: {
// 菜单树数据
......@@ -52,7 +55,10 @@ export default {
fullLoading: {
visible: false,
timer: null
}
},
// 接口到期弹窗
showExpireDialog: false,
expireData: {}
};
},
watch: {
......@@ -75,8 +81,29 @@ export default {
this.enterpriseId = JSON.parse(sessionStorage.getItem('userInfos') || '{}').enterpriseId;
this.$on('command', this.onCommand);
this.getEnterpriseSecret();
this.getEnterpriseOverdue();
},
methods: {
getEnterpriseOverdue() {
let para = {
wxEnterpriseId: JSON.parse(sessionStorage.getItem('userInfos')).wxEnterpriseId
};
getRequest('/haoban-manage3-web/qywx-fee-wxEnterprise-detail', para).then(res => {
const { code, result } = res.data || {};
if (code != 0) {
errorMsg.errorMsg(res.data);
return;
}
if (!result) return;
// result.interceptTime = 1660319999000;
let last = sessionStorage.getItem('permission-interceptor-time');
if (filters.timeStampMode(last) == 0) return;
result.interceptTimeNew = filters.timeStampMode(result.interceptTime);
if (result.interceptTimeNew < 0) return;
this.expireData = result;
this.showExpireDialog = true;
});
},
getEnterpriseSecret() {
if (this.$route.path == '/enterpriseSet') return;
getRequest('/haoban-manage3-web/is-wx-enterprise-secret-set', {}).then(res => {
......
......@@ -97,7 +97,20 @@ const timeStampToYmd = function(data) {
let newMonth = month < 10 ? '0' + month : month;
return `${date.getFullYear()}-${newMonth}-${day}`;
};
/**
* 时间戳---> 年-月-日
* @param timestamp
*/
const timeStampToYmd3 = function(data) {
if (!data) {
return;
}
let date = new Date(data);
let month = date.getMonth() + 1;
let day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
let newMonth = month < 10 ? '0' + month : month;
return `${date.getFullYear()}${newMonth}${day}日`;
};
/**
* 时间戳---> 年-月-日
* @param timestamp
......@@ -154,7 +167,34 @@ const timeStampSpace = function(date) {
// let seconds = Math.round(leave3 / 1000);
return `${days}${hours}小时${minutes}分`;
};
// 时间戳转化为明后天系列
const timeStampMode = function(time) {
if (!isNaN(time)) time = Number(time);
let now = new Date(); // 当前时间
console.log(now);
let today = new Date(`${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()} 23:59:59`).getTime(); // 今天
let yesterday = new Date(`${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate() - 1} 23:59:59`).getTime(); // 昨天
let tomorrow = new Date(`${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate() + 1} 23:59:59`).getTime(); // 明天
let dayAfterTomorrow = new Date(`${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate() + 2} 23:59:59`).getTime(); // 后天
console.log((time - today) / (24 * 60 * 60 * 1000));
if (time <= today && time > yesterday) {
// 今天
return 0;
} else if (time > today && time <= tomorrow) {
// 明天
return 1;
} else if (time > tomorrow && time <= dayAfterTomorrow) {
// 后天
return 2;
} else if (time > dayAfterTomorrow) {
// 未来时间
let sub = parseInt((time - today) / (24 * 60 * 60 * 1000)) + 1;
return sub;
} else if (time <= yesterday) {
// 昨天以前
return -1;
}
};
/**
* 手机号格式化
* @param {String} phone
......@@ -217,6 +257,8 @@ export default {
formatTimeYmdHms,
formatPhoneNum,
timeStampToYmd2,
timeStampToYmd3,
timeStampMode,
formatName,
timeStampSpace,
formatTime,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment