🎉初版支持自动推送

This commit is contained in:
Eigeen 2023-03-25 11:21:43 +08:00
commit d61a40e7c0
9 changed files with 1234 additions and 0 deletions

138
.gitignore vendored Normal file
View File

@ -0,0 +1,138 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 Eigeen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

138
__init__.py Normal file
View File

@ -0,0 +1,138 @@
from .config import Config
from .page_parser import PageParser
from .db import CachedNotice
from .notice import Notice
import os
from pathlib import Path
import aiohttp
from nonebot_plugin_apscheduler import scheduler
import nonebot
from nonebot import on_command, require
from nonebot.log import logger
from nonebot.rule import Rule
from nonebot.adapters.onebot.v11.adapter import Message, MessageSegment
from nonebot.adapters.onebot.v11 import Message, MessageSegment, Bot, MessageEvent
from nonebot.matcher import Matcher
from nonebot.params import CommandArg
require("nonebot_plugin_apscheduler")
notice_pusher = on_command("csust_notice_pusher", rule=Rule(), priority=5)
PACKAGE_PATH = os.path.dirname(os.path.abspath(__file__))
DATA_PATH = Path().absolute() / "data" / "notice_pusher"
DB_PATH = DATA_PATH / "cache.db"
GLOBAL_CFG = nonebot.get_driver().config
CFG = Config.parse_obj(GLOBAL_CFG.dict())
XGDT_URL = 'https://www.csust.edu.cn/gjxy/xgdt.htm'
XFZX_URL = 'https://www.csust.edu.cn/gjxy/xxyfzzx.htm'
URL_PREFIX = 'https://www.csust.edu.cn/gjxy/'
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.50',
}
logger.info('加载数据库文件: ' + str(DB_PATH))
db = CachedNotice(DB_PATH)
async def check_and_push():
msg = await auto_check()
await push_all(msg)
async def auto_check() -> list[str]:
msgs = []
xgdt_notices = await get_notices(XGDT_URL)
xfzx_notices = await get_notices(XFZX_URL)
xgdt_updates = []
xfzx_updates = []
# 学工动态
for i, n in enumerate(xgdt_notices):
if db.is_notice_exists(n.id):
continue
full_url = URL_PREFIX + n.url
msg = f'{i+1}. \n标题:{n.title}\n内容预览:{n.content_preview[:40]}\n链接:{full_url}\n\n'
xgdt_updates.append(msg)
db.add_notice(Notice(*n.get_properties()))
logger.info("学工动态更新: " + msg)
# 学发中心
for i, n in enumerate(xfzx_notices):
if db.is_notice_exists(n.id):
continue
full_url = URL_PREFIX + n.url
msg = f'{i+1}. \n标题:{n.title}\n内容预览:{n.content_preview[:40]}\n链接:{full_url}\n\n'
xfzx_updates.append(msg)
db.add_notice(Notice(*n.get_properties()))
logger.info("学发中心更新: " + msg)
if xgdt_updates:
msgs.append('学工动态更新:\n')
msgs += xgdt_updates
if xfzx_updates:
msgs.append('学发中心更新:\n')
msgs += xfzx_updates
return msgs
async def get_notices(url: str):
page_content = await get_page(url)
if not page_content:
return
parser = PageParser(page_content)
notices = parser.get_notices()
return notices
async def get_page(url: str) -> str:
"""获取页面
Raises:
IOError: 页面获取失败
"""
async with aiohttp.ClientSession() as session:
async with session.get(url=url, headers=HEADERS) as res:
if res.status != 200:
raise IOError('页面获取失败: Code ' + res.status)
return await res.text()
async def push_all(msg: str):
for gid in CFG.notice_pusher_enable:
await push_to_group(gid, msg)
async def push_to_group(groupid: int, msg: str):
bot = nonebot.get_bot()
await bot.send_group_msg(group_id=groupid, message=Message(msg))
async def push_error_to_admins(user_id: list[int], msg: str):
bot = nonebot.get_bot()
for u in user_id:
await bot.send_private_msg(user_id=user_id, message=Message(msg))
scheduler.add_job(
check_and_push,
'cron',
hour=9,
minute=0,
second=0,
id='check_notice_and_push'
)
@notice_pusher.handle()
async def handle_pusher(matcher: Matcher, event: MessageEvent, arg: Message = CommandArg()):
try:
msg = await auto_check()
except IOError as e:
await push_error_to_admins(GLOBAL_CFG.superusers, str(e))
return
await matcher.finish(msg)

6
config.py Normal file
View File

@ -0,0 +1,6 @@
from typing import List
from pydantic import BaseModel, Extra
class Config(BaseModel, extra=Extra.ignore):
notice_pusher_enable: List = []

69
db.py Normal file
View File

@ -0,0 +1,69 @@
import sqlite3
import os
from .notice import Notice
from typing import Any
from nonebot.log import logger
class CachedNotice(object):
def __init__(self, db_path: str) -> None:
self.engine = None
self.db_path = db_path
self.connect()
self.init_table()
def __del__(self):
self.engine.close()
def connect(self):
self.engine = sqlite3.connect(self.db_path)
def init_table(self):
cur = self.engine.cursor()
cur.execute("""CREATE TABLE IF NOT EXISTS notices (
id BIGINT PRIMARY KEY,
url TEXT NOT NULL DEFAULT '',
title TEXT NOT NULL DEFAULT '',
content_preview TEXT NOT NULL DEFAULT '',
publish_date DATE NOT NULL DEFAULT '',
content TEXT NOT NULL DEFAULT '',
source TEXT NOT NULL DEFAULT ''
);""")
self.engine.commit()
cur.close()
def get_notice_by_id(self, id: int) -> Notice:
cur = self.engine.cursor()
cur.execute(
f"""SELECT id, url, title, content_preview, publish_date, content, source FROM notices WHERE id = {id}""")
data = cur.fetchone()
cur.close()
if data:
return Notice(*data)
else:
return None
def is_notice_exists(self, notice_id: int) -> bool:
res = self.get_notice_by_id(notice_id)
if res:
return True
else:
return False
def add_notice(self, data: Notice):
if self.is_notice_exists(data.id):
return
cur = self.engine.cursor()
sql = """INSERT INTO notices (id, url, title, content_preview, publish_date, content, source)
VALUES ({}, '{}', '{}', '{}', '{}', '{}', '{}');""".format(*map(quote_escape, data.get_properties()))
cur.execute(sql)
self.engine.commit()
cur.close()
def quote_escape(x: str | Any):
if isinstance(x, str):
x = x.replace("'", "''")
return x

58
entity_generator.py Normal file
View File

@ -0,0 +1,58 @@
def main(pstr: str, defaults: dict):
properties = pstr.rsplit(',')
result = ''
arg_init_head = """ def __init__(self, {}):\n"""
arg_init_line = """ self.__{0} = {0}\n"""
noarg_init_head = """ def __init__(self):\n"""
noarg_init_line = """ self.__{0} = {1}\n"""
getter = """ @property
def {0}(self):
return self.__{0}
"""
setter = """ @{0}.setter
def {0}(self, value):
if value == None:
self.__{0} = ''
self.__{0} = value
"""
# 有参构造器
result += arg_init_head.format(', '.join(properties))
for p in properties:
result += arg_init_line.format(p)
# 无参构造器
result += '\n'
result += noarg_init_head
for p in properties:
if p in defaults:
default = str(defaults[p])
else:
default = "''"
result += noarg_init_line.format(p, default)
# property
for p in properties:
result += '\n'
result += getter.format(p)
result += '\n'
result += setter.format(p)
# get_properties()
result += '\n'
result += ' def get_properties(self) -> list:\n'
_ret = list(map(lambda x: 'self.' + x, properties))
_ret = ', '.join(_ret)
result += ' return {}'.format(_ret)
# tostring()
print(result)
if __name__ == '__main__':
properties = 'id,url,title,content_review,publish_date,content,source'
defaults = {'publish_date': None, 'id': 0}
main(properties, defaults)

90
notice.py Normal file
View File

@ -0,0 +1,90 @@
from datetime import date, datetime
from typing import Any
class Notice(object):
"""通知实体类
"""
def __init__(self, id=0, url='', title='', content_preview='', publish_date: date=None, content='', source=''):
self.__id = id
self.__url = url
self.__title = title
self.__content_preview = content_preview
self.publish_date = publish_date
self.__content = content
self.__source = source
@property
def id(self):
return self.__id
@id.setter
def id(self, value):
if value == None:
self.__id = 0
self.__id = value
@property
def url(self):
return self.__url
@url.setter
def url(self, value):
if value == None:
self.__url = ''
self.__url = value
@property
def title(self):
return self.__title
@title.setter
def title(self, value):
if value == None:
self.__title = ''
self.__title = value
@property
def content_preview(self):
return self.__content_preview
@content_preview.setter
def content_preview(self, value):
if value == None:
value = ''
self.__content_preview = value
@property
def publish_date(self):
return self.__publish_date.strftime("%Y-%m-%d")
@publish_date.setter
def publish_date(self, value: date):
if isinstance(value, str):
dt = datetime.strptime(value, '%Y-%m-%d')
value = dt.date()
self.__publish_date = value
@property
def content(self):
return self.__content
@content.setter
def content(self, value):
if value == None:
self.__content = ''
self.__content = value
@property
def source(self):
return self.__source
@source.setter
def source(self, value):
if value == None:
self.__source = ''
self.__source = value
def get_properties(self) -> list:
return self.id, self.url, self.title, self.content_preview, self.publish_date, self.content, self.source

66
page_parser.py Normal file
View File

@ -0,0 +1,66 @@
from lxml import etree
import re
from datetime import date
try:
import ujson as json
except:
import json
try:
from .notice import Notice
except ImportError:
from notice import Notice
class PageParser(object):
"""解析器类
"""
REG = re.compile(r'info/\d+/(\d+).htm', re.S)
def __init__(self, page: str) -> None:
self._page_content = page
self._notices = []
self._parse()
def _parse(self):
"""解析页面
"""
root = etree.HTML(self._page_content)
elements = root.xpath("//ul[@class='secList pageList']/li")
for e in elements:
notice = Notice()
notice.title = e.xpath("div[@class='r']//a/text()")[0]
url = str(e.xpath("div[@class='r']//a/@href")[0])
notice.url = url
notice.id = self._get_id(url)
content_review = e.xpath(
"div[@class='r']/div[@class='intro']/text()")[0]
content_review = content_review.replace('\\n', '').strip()
notice.content_preview = content_review
year, month = e.xpath("div[@class='l']/text()")[0].split('-')
day = e.xpath("div[@class='l']/span/text()")[0]
notice.publish_date = date(
year=int(year), month=int(month), day=int(day))
self._notices.append(notice)
def _get_id(self, url: str) -> int:
res = self.REG.findall(url)[0]
return int(res)
def get_notices(self) -> list[Notice]:
return self._notices
# def _parse_date(self, date_str: str) -> date:
# pass
# def test(self):
# root = etree.HTML(self._page_content)
# elements = root.xpath("//ul[@class='secList pageList']/li")
# e = elements[0]
# print(type(e.xpath("div[@class='r']//a/@href")[0]))
if __name__ == "__main__":
with open('sample.html', encoding='utf-8') as fp:
parser = PageParser(fp.read())
parser.test()

648
sample.html Normal file
View File

@ -0,0 +1,648 @@
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>学工动态-国际工学院</title>
<META Name="keywords" Content="国际工学院,学工动态" />
<meta name="description" content="长沙理工大学·国际学院" />
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<link href="dfiles/3935/pub/gjxy/images/gjxycss.jpg.css" type="text/css" rel="stylesheet">
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="dfiles/3935/pub/gjxy/images/jquery.min.js">
</script>
<!-- Custom Theme files -->
<!-- for bootstrap working -->
<script type="text/javascript" src="dfiles/3935/pub/gjxy/images/bootstrap.js">
</script>
<!-- //for bootstrap working -->
<script src="dfiles/3935/pub/gjxy/images/responsiveslides.min.js">
</script>
<script type="text/javascript" src="dfiles/3935/pub/gjxy/images/move-top.js">
</script>
<script type="text/javascript" src="dfiles/3935/pub/gjxy/images/easing.js">
</script>
<!--/script-->
<script type="text/javascript">
jQuery(document).ready(function ($) {
$(".scroll").click(function (event) {
event.preventDefault();
$('html,body').animate({ scrollTop: $(this.hash).offset().top }, 900);
});
});
</script>
<script type="text/javascript" src="dfiles/3935/pub/gjxy/images/menujs.js">
</script>
<!--Announced by Visual SiteBuilder 9-->
<link rel="stylesheet" type="text/css" href="_sitegray/_sitegray_d.css" />
<script language="javascript" src="_sitegray/_sitegray.js"></script>
<!-- CustomerNO:7765626265723230747a475452545742000200014751 -->
<link rel="stylesheet" type="text/css" href="lby.vsb.css" />
<script type="text/javascript" src="/system/resource/js/counter.js"></script>
<script type="text/javascript">_jsq_(1285, '/lby.jsp', -1, 1390296022)</script>
</head>
<body>
<!-- header-section-starts-here -->
<div class="header" id="movetop">
<div class="container">
<div class="header-top">
<div class="logo left"><a href="sy.htm" target=""><img src="dfiles/3935/pub/gjxy/images/logo.png"></a>
</div>
<div class="social right"><a href="http://www.csust.edu.cn/gjjlc/index.htm" target="_blank">国际交流处</a>|<a
href="mailto:lxskq2011@163.com">学院信箱</a>|<a href="ywbwz/Home.htm" target="">ENGLISH</a></div>
<div class="search right">
<script type="text/javascript">
function _nl_ys_check() {
var keyword = document.getElementById('showkeycode129384').value;
if (keyword == null || keyword == "") {
alert("请输入你要检索的内容!");
return false;
}
if (window.toFF == 1) {
document.getElementById("lucenenewssearchkey129384").value = Simplized(keyword);
} else {
document.getElementById("lucenenewssearchkey129384").value = keyword;
}
var base64 = new Base64();
document.getElementById("lucenenewssearchkey129384").value = base64.encode(document.getElementById("lucenenewssearchkey129384").value);
new VsbFormFunc().disableAutoEnable(document.getElementById("showkeycode129384"));
return true;
}
</script>
<form action="copy_1_copy_3_lby.jsp?wbtreeid=1285" method="post" id="au0a" name="au0a"
onsubmit="return _nl_ys_check()"><input type="hidden" id="lucenenewssearchkey129384"
name="lucenenewssearchkey" value=""><input type="hidden" id="_lucenesearchtype129384"
name="_lucenesearchtype" value="1"><input type="hidden" id="searchScope129384"
name="searchScope" value="0">
<input name="showkeycode" id="showkeycode129384" class="search_text" value="Search..."
onFocus="if(value==defaultValue){value='';this.style.color='#999'}"
onBlur="if(!value){value=defaultValue;this.style.color='#999'}"><input type="submit"
class="search_bnt" value="" />
</form>
<script language="javascript" src="/system/resource/js/base64.js"></script>
<script language="javascript" src="/system/resource/js/formfunc.js"></script>
</div>
<div class="clearfix"></div>
</div>
<!-- navigation -->
<div class="navigation">
<ul class="nav menu">
<li class="menu_1"><a href="index.htm">学院首页</a>
</li>
<li class="menu_2"><a href="xygk.htm">学院概况</a>
<dl class="subnav">
<dt><a href="xygk/xyjj.htm">学院简介</a></dt>
<dt><a href="xygk/xrld.htm">现任领导</a></dt>
<dt><a href="xygk/jgsz.htm">机构设置</a></dt>
<dt><a href="xygk/lxwm.htm">联系我们</a></dt>
</dl>
</li>
<li class="menu_3"><a href="hzbx.htm">合作办学</a>
<dl class="subnav">
<dt><a href="hzbx/tmgczy.htm">土木工程专业</a></dt>
<dt><a href="hzbx/dqgcjqzdhzy.htm">电气工程及其自动化专业</a></dt>
<dt><a href="hzbx/jxsjzzjqzdh.htm">机械设计制造及其自动化</a></dt>
</dl>
</li>
<li class="menu_4"><a href="jgbgz.htm">教改班工作</a>
<dl class="subnav">
<dt><a href="jgbgz/bjjj.htm">班级简介</a></dt>
<dt><a href="jgbgz/gzzd.htm">规章制度</a></dt>
<dt><a href="jgbgz/xxdt.htm">学习动态</a></dt>
</dl>
</li>
<li class="menu_5"><a href="xsgz.htm">学生工作</a>
<dl class="subnav">
<dt><a href="xsgz/xsdj.htm">学生党建</a></dt>
<dt><a href="xsgz/xfjs.htm">学风建设</a></dt>
<dt><a href="xsgz/rcgl.htm">日常管理</a></dt>
<dt><a href="xsgz/txgz.htm">团学工作</a></dt>
<dt><a href="xsgz/xljk.htm">心理健康</a></dt>
<dt><a href="xsgz/zsjy.htm">招生就业</a></dt>
<dt><a href="xsgz/rybd.htm">荣誉榜单</a></dt>
</dl>
</li>
<li class="menu_6"><a href="lxsjy.htm">留学生教育</a>
<dl class="subnav">
<dt><a href="lxsjy/gzzd.htm">规章制度</a></dt>
<dt><a href="lxsjy/zsgz.htm">招生工作</a></dt>
<dt><a href="lxsjy/jypy.htm">教育培养</a></dt>
<dt><a href="lxsjy/xysh.htm">校园生活</a></dt>
<dt><a href="lxsjy/xshd.htm">学生活动</a></dt>
<dt><a href="lxsjy/xytd.htm">校友天地</a></dt>
<dt><a href="lxsjy/mtjj.htm">媒体聚焦</a></dt>
<dt><a href="lxsjy/HSKkdgz.htm">HSK考点工作</a></dt>
</dl>
</li>
<li class="menu_7"><a href="dqgz.htm">党群工作</a>
<dl class="subnav">
<dt><a href="dqgz/zzjg.htm">组织机构</a></dt>
<dt><a href="dqgz/gzzd.htm">规章制度</a></dt>
<dt><a href="dqgz/djdt.htm">党建动态</a></dt>
<dt><a href="dqgz/dsxxjyzt.htm">党史学习教育专题</a></dt>
<dt><a href="dqgz/dyfc.htm">党员风采</a></dt>
<dt><a href="dqgz/ghgz.htm">工会工作</a></dt>
</dl>
</li>
<li class="menu_8"><a href="pxyjs.htm">培训与竞赛</a>
<dl class="subnav">
<dt><a href="pxyjs/gzzd.htm">规章制度</a></dt>
<dt><a href="pxyjs/xkjs.htm">学科竞赛</a></dt>
<dt><a href="pxyjs/czkt.htm">成长课堂</a></dt>
<dt><a href="pxyjs/swpx.htm">涉外培训</a></dt>
</dl>
</li>
</ul>
<div class="clearfix"></div>
</div>
<!-- //navigation -->
</div>
</div>
<!-- header-section-ends-here -->
<div class="slider">
<ul class="rslides" id="slider1">
<li><img src="dfiles/3935/pub/gjxy/images/show_pho1.jpg"></li>
</ul>
</div>
<div class="content">
<!-- Our-staff-starts -->
<div class="show">
<div class="container">
<div class="show-head text-center">
<header>
<h3>
学工动态</h3>
</header>
</div>
<div class="show-grids">
<div class="col-md-3 pl30 left">
<ul class="menu_list"></ul>
</div>
<div class="col-md-5 pr30 right">
<div class="show_title">
<h3>
学工动态</h3>
</div>
<div class="tit-content">
<script language="javascript" src="/system/resource/js/centerCutImg.js"></script>
<script language="javascript" src="/system/resource/js/dynclicks.js"></script>
<script language="javascript" src="/system/resource/js/ajax.js"></script>
<ul class="secList pageList">
<li id="line_u5_0">
<div class="r">
<dt><a href="info/1285/5152.htm"
title="国际工学院学生党支部开展2022年度组织生活会">国际工学院学生党支部开展2022年度组织生活会</a></dt>
<div class="intro">
近日国际工学院各学生党支部在新能源大楼一栋陆续开展2022年度组织生活会。会议由各党支部书记主持国际工学院党总支书记王学成院长吴迪龙副书记兼副院长乔法光党总支委员...
</div>
</div>
<div class="l">2023-03<br /><span>21</span></div>
<div class="clearfix"></div>
</li>
<li id="line_u5_1">
<div class="r">
<dt><a href="info/1285/5146.htm"
title="总分第二我院土木教改1901班获校2022年度“示范班集体”">总分第二我院土木教改1901班获校2022年度“示范班集体”</a>
</dt>
<div class="intro">
为进一步加强班风、学风和校风建设发挥典型示范引领作用3月14日下午我校2022年“示范班集体”决选在云塘校区图书馆报告厅举行。其中我院土木教改1901班以总分第二的优秀成...
</div>
</div>
<div class="l">2023-03<br /><span>15</span></div>
<div class="clearfix"></div>
</li>
<li id="line_u5_2">
<div class="r">
<dt><a href="info/1285/5141.htm"
title="春暖花开,奋斗当时--国际工学院召开毕(就)业工作推进会">春暖花开,奋斗当时--国际工学院召开毕(就)业工作推进会</a>
</dt>
<div class="intro">
3月14日下午国际工学院在新能源大楼1栋416会议室召开2023届毕业工作推进会暨毕业年级班主任大会。院党总支书记王学成副书记兼副院长乔法光学工办、教务办以及2023届毕业生...
</div>
</div>
<div class="l">2023-03<br /><span>15</span></div>
<div class="clearfix"></div>
</li>
<li id="line_u5_3">
<div class="r">
<dt><a href="info/1285/5128.htm"
title="留学生争当“洋雷锋” ——国际工学院、交通学院联合开展青马工程暨“书写新时代雷锋故事”主题分享会">留学生争当“洋雷锋”
——国际工学院、交通学院联合开展青马...</a></dt>
<div class="intro">
为了纪念毛泽东等老一辈革命家为雷锋同志题词60周年3月6日交通学院、国际工学院在文科楼A200联合开展青马工程暨“书写新时代雷锋故事”主题分享会。206名青年学子齐聚一堂共话...
</div>
</div>
<div class="l">2023-03<br /><span>06</span></div>
<div class="clearfix"></div>
</li>
<li id="line_u5_4">
<div class="r">
<dt><a href="info/1285/5123.htm"
title="“书写新时代雷锋故事”——国际学子走进社区话雷锋学雷锋">“书写新时代雷锋故事”——国际学子走进社区话雷锋学雷锋</a></dt>
<div class="intro">
三月春风暖人心雷锋精神代代传。3月3日长沙理工大学国际工学院学生党员代表携手学院来华留学生代表深入长沙市天心区暮云街道卢浮社区开展中外青年学生进社区学雷锋志愿服务...
</div>
</div>
<div class="l">2023-03<br /><span>06</span></div>
<div class="clearfix"></div>
</li>
<li id="line_u5_5">
<div class="r">
<dt><a href="info/1285/5115.htm"
title="“书写新时代雷锋故事”——国际工学院学生党员“朋辈小课堂”助力学业帮扶">“书写新时代雷锋故事”——国际工学院学生党员“朋辈小课堂...</a>
</dt>
<div class="intro">
为提升学业帮扶实效国际工学院的学生党员们在新学期开学第一周主动开设“朋辈小课堂”开展系列朋辈学业帮扶活动帮助学习困难同学完成学业。本次党员“朋辈小课堂”分8个场次开...
</div>
</div>
<div class="l">2023-03<br /><span>04</span></div>
<div class="clearfix"></div>
</li>
<li id="line_u5_6">
<div class="r">
<dt><a href="info/1285/5114.htm"
title="“职”等你来,如沐春风--国际工学院举办就业指导讲座">“职”等你来,如沐春风--国际工学院举办就业指导讲座</a></dt>
<div class="intro">
为帮助毕业生把握春季招聘黄金期3月3日晚国际工学院在新能源大楼1栋402报告厅举办了2023届毕业生就业指导专题讲座。讲座邀请了中铁建电气化局四公司人力资源部曾妮作为主讲嘉宾...
</div>
</div>
<div class="l">2023-03<br /><span>04</span></div>
<div class="clearfix"></div>
</li>
<li id="line_u5_7">
<div class="r">
<dt><a href="info/1285/5126.htm"
title="春风浩荡满目新扬帆奋进正当时——国际工学院召开2022级新学期班级学生干部大会">春风浩荡满目新扬帆奋进正当时——国际工学院召开2022级新...</a>
</dt>
<div class="intro">
3月3日中午国际工学院2022级新学期班级学生干部大会在云塘校区新能源大楼1栋4楼会议室召开。学院党总支副书记兼副院长乔法光、2022级全体辅导员和班级学生干部参会。本次会议由年...
</div>
</div>
<div class="l">2023-03<br /><span>04</span></div>
<div class="clearfix"></div>
</li>
<li id="line_u5_8">
<div class="r">
<dt><a href="info/1285/5109.htm"
title="“规范停车,文明出行”——国际工学院开展校内学雷锋志愿服务">“规范停车,文明出行”——国际工学院开展校内学雷锋志愿服务</a>
</dt>
<div class="intro">
为弘扬践行雷锋精神纪念毛泽东等老一辈革命家为雷锋同志题词60周年用实际行动书写新时代雷锋故事3月1日中午长沙理工大学国际工学院开展了“书写新时代雷锋故事——规范停车...
</div>
</div>
<div class="l">2023-03<br /><span>01</span></div>
<div class="clearfix"></div>
</li>
<li id="line_u5_9">
<div class="r">
<dt><a href="info/1285/5082.htm"
title="“启航新征程,青春正当时”——国际工学院领导老师走访学生宿舍">“启航新征程,青春正当时”——国际工学院领导老师走访学生宿舍</a>
</dt>
<div class="intro">
新学期伊始为更好地了解学生学习生活情况2月21日下午国际工学院党总支书记王学成、院长吴迪龙、副书记兼副院长乔法光以及学工办、留工办全体辅导员深入学生宿舍看望返校学生...
</div>
</div>
<div class="l">2023-02<br /><span>22</span></div>
<div class="clearfix"></div>
</li>
<li id="line_u5_10">
<div class="r">
<dt><a href="info/1285/5064.htm"
title="国际工学院召开2023年春季学期第一次主题班会">国际工学院召开2023年春季学期第一次主题班会</a></dt>
<div class="intro">
2023年2月19日晚国际工学院组织召开“启航新征程青春正当时”为主题的新学期第一次班会。学院辅导员、各班班主任、全体学生分班级参加此次班会班会由各班班长主持。首先各班...
</div>
</div>
<div class="l">2023-02<br /><span>20</span></div>
<div class="clearfix"></div>
</li>
<li id="line_u5_11">
<div class="r">
<dt><a href="info/1285/5050.htm"
title="国际工学院成功举办2023年心理健康教育讲座暨心理健康教育队伍培训">国际工学院成功举办2023年心理健康教育讲座暨心理健康教育队...</a>
</dt>
<div class="intro">
---自己的心理咨询师--大学生自我成长和心理调适2月13日晚国际工学院成功举办“做自己的心理咨询师--大学生自我成长和心理调适”心理讲座暨心理健康教育队伍培训,本次讲座由教育部...
</div>
</div>
<div class="l">2023-02<br /><span>18</span></div>
<div class="clearfix"></div>
</li>
</ul>
<div class="clearfix"></div>
<div class="pageChanger"><INPUT TYPE="hidden" NAME="actiontype" VALUE=""><input
type="hidden" name="_scode_" value="1679471134155"><input type="hidden"
name="urltype" value="tree.TreeTempUrl"><input type="hidden" name="wbtreeid"
value="1285"><input type="hidden" name="outFlag" value="false">
<style type="text/css">
.headStyle14mtowhg3z,
.headStyle14mtowhg3z td,
.headStyle14mtowhg3z div {
font-size: 12px;
font-family: 宋体;
color: #000000;
margin-left: auto;
margin-right: auto;
line-height: 14px;
}
.defaultButtonStyle {
font-size: 12px;
font-family: 宋体;
height: 20px;
color: #000000;
BORDER: #AFD5F5 1px solid;
margin: 0px;
padding: 0px;
FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#BDDBF7);
CURSOR: pointer;
line-height: 14px;
background: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#BDDBF7));
background: -moz-linear-gradient(top, #ffffff, #BDDBF7);
background: -ms-linear-gradient(top, #ffffff 0%, #bddbf7 100%);
}
.defaultinputStyle {
font-size: 12px;
font-family: 宋体;
height: 20px;
border: 1px solid #AFD5F5;
line-height: 14px;
}
.colHeader {
font-size: 12px;
font-family: 宋体;
line-height: 14px;
}
.headStyle14mtowhg3z a,
.pageList .this-page {
font-size: 12px;
font-family: 宋体;
display: inline-block;
height: 14px;
padding: 2px 4px;
border: solid 1px #AFD5F5;
background: #fff;
text-decoration: none;
MARGIN-RIGHT: 1px;
line-height: 14px;
}
.headStyle14mtowhg3z a:visited {
font-size: 12px;
font-family: 宋体;
color: #000000;
text-decoration: none;
line-height: 14px;
}
.headStyle14mtowhg3z .PrevDisabled {
font-size: 12px;
font-family: 宋体;
display: inline-block;
height: 14px;
margin-right: 3px;
padding: 2px 4px;
background: #fff;
color: #ccc;
border: solid 1px #AFD5F5;
line-height: 14px;
}
.headStyle14mtowhg3z .SelectList {
font-size: 12px;
font-family: 宋体;
line-height: 14px;
}
.headStyle14mtowhg3z .Prev {
font-size: 12px;
font-family: 宋体;
margin-right: 3px;
padding: 2px 4px;
line-height: 14px;
}
.headStyle14mtowhg3z .break {
font-size: 12px;
font-family: 宋体;
border: none;
text-decoration: none;
line-height: 14px;
}
.headStyle14mtowhg3z .NextDisabled {
font-size: 12px;
font-family: 宋体;
display: inline-block;
height: 14px;
margin-left: 2px;
padding: 2px 4px;
background: #fff;
color: #ccc;
border: solid 1px #AFD5F5;
line-height: 14px;
}
.headStyle14mtowhg3z .Next {
font-size: 12px;
font-family: 宋体;
margin-left: 2px;
padding: 2px 4px;
line-height: 14px;
}
.headStyle14mtowhg3z .this-page {
font-size: 12px;
font-family: 宋体;
display: inline-block;
height: 14px;
padding: 2px 4px;
border: solid 1px #AFD5F5;
background: #E1F0FD;
font-weight: bold;
color: black;
MARGIN-RIGHT: 1px;
line-height: 14px;
}
.headStyle14mtowhg3z a:hover {
font-size: 12px;
font-family: 宋体;
color: black;
background: #EFF7FE;
border-color: #AFD5F5;
text-decoration: none;
line-height: 14px;
}
.headStyle14mtowhg3z a:link {
font-size: 12px;
font-family: 宋体;
color: #000000;
text-decoration: none;
line-height: 14px;
}
.headStyle14mtowhg3z a:active {
font-size: 12px;
font-family: 宋体;
color: black;
text-decoration: none;
background: #EFF7FE;
line-height: 14px;
}
</style>
<script language="javascript" src="/system/resource/js/gotopage.js"></script>
<script
type="text/javascript">function a130649_gopage_fun() { _simple_list_gotopage_fun(29, 'a130649GOPAGE', 2) }</script>
<table cellspacing="0" cellpadding="0" border="0">
<TR>
<td colspan="0">
<table cellspacing="0" class="headStyle14mtowhg3z" width="100%"
cellpadding="1">
<tr valign="middle">
<TD nowrap align="left" width="1%" id="fanye130649">
共344条&nbsp;&nbsp;1/29&nbsp;</td>
<td nowrap align="left">
<div><span class="PrevDisabled">首页</span><span
class="PrevDisabled">上页</span><a href="xgdt/28.htm"
class="Next">下页</a><a href="xgdt/1.htm"
class="Next">尾页</a>&nbsp;&nbsp;<input align="absmiddle"
type="button" class="defaultButtonStyle"
id="gotopagebut" name="a130649Find" value="转到"
onclick="javascript:a130649_gopage_fun()"><INPUT
size="2" align="absmiddle" class="defaultInputStyle"
NAME="a130649GOPAGE" id="a130649GOPAGE" VALUE=""
style="margin-left:1px;margin-right:1px">页</div>
</td>
</tr>
</table>
</table>
</div>
<script>_showDynClickBatch(['dynclicks_u5_5152', 'dynclicks_u5_5146', 'dynclicks_u5_5141', 'dynclicks_u5_5128', 'dynclicks_u5_5123', 'dynclicks_u5_5115', 'dynclicks_u5_5114', 'dynclicks_u5_5126', 'dynclicks_u5_5109', 'dynclicks_u5_5082', 'dynclicks_u5_5064', 'dynclicks_u5_5050'], [5152, 5146, 5141, 5128, 5123, 5115, 5114, 5126, 5109, 5082, 5064, 5050], "wbnews", 1390296022)</script>
</div>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
<!-- //Our-staff-ends -->
<div class="footer">
<div class="footer-top">
<div class="container">
<div class="col-md-4 left">
<ul class="links">
<script language="javascript" src="/system/resource/js/openlink.js"></script>
<li><a target="_blank" href="http://www.csust.edu.cn/gjjlc/index.htm" title=""
onclick="_addDynClicks(&#34;wburl&#34;, 1390296022, 14711)">· 国际交流处</a></li>
<li><a target="_blank" href="http://www.csust.edu.cn/wgyxy/index.htm" title=""
onclick="_addDynClicks(&#34;wburl&#34;, 1390296022, 14712)">· 外国语学院</a></li>
<li><a target="_blank" href="http://www.csust.edu.cn/xsgzb/index.htm" title=""
onclick="_addDynClicks(&#34;wburl&#34;, 1390296022, 14715)">· 学生工作部</a></li>
<li><a target="_blank" href="http://www.csust.edu.cn/xtw/index.htm" title=""
onclick="_addDynClicks(&#34;wburl&#34;, 1390296022, 14716)">· 校团委</a></li>
</ul>
<ul class="links">
<li><a target="_blank" href="http://www.hanban.edu.cn/" title=""
onclick="_addDynClicks(&#34;wburl&#34;, 1390296022, 14718)">· 孔子学院总部/国家汉办</a></li>
<li><a target="_blank" href="http://www.csc.edu.cn/" title=""
onclick="_addDynClicks(&#34;wburl&#34;, 1390296022, 14721)">· 国家留学网</a></li>
<li><a target="_blank" href="http://www.jsj.edu.cn/" title=""
onclick="_addDynClicks(&#34;wburl&#34;, 1390296022, 14722)">· 中外合作办学监管网</a></li>
<li><a target="_blank" href="http://www.chinesetest.cn/index.do" title=""
onclick="_addDynClicks(&#34;wburl&#34;, 1390296022, 14726)">· 汉语考试服务网</a></li>
</ul>
</div>
<div class="col-md-4-1 left bor-l footer-contact">
<ul>
<li class="ico_add">地址:湖南省长沙市(雨花区)万家丽南路2段960号</li>
<li class="ico_tel">电话:(+86731-85256019</li>
<li class="ico_fax">传真0731-85256019</li>
<li class="ico_mail">邮箱cslggjxy@csust.edu.cn</li>
</ul>
</div>
<div class="col-md-4-2 right bor-l"><img src="dfiles/3935/pub/gjxy/images/foot_QR.gif" /></div>
<div class="clearfix"></div>
</div>
</div>
<div class="footer-bottom">
<div class="container">
<div class="copyrights">
<p>CopyRight &copy; 2015-2018 All Right
Reserved&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;长沙理工大学国际工学院版权所有
<script>
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?e2588c00e9bdc9fbd21b8da77023546c";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</p>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function () {
/*
var defaults = {
containerID: 'toTop', // fading element id
containerHoverID: 'toTopHover', // fading element hover id
scrollSpeed: 1200,
easingType: 'linear'
};
*/
$().UItoTop({ easingType: 'easeOutQuart' });
});
</script>
<a href="#to-top" id="toTop" style="display: block;"> <span id="toTopHover" style="opacity: 1;"> </span></a>
<script type="text/javascript" src="dfiles/3935/pub/gjxy/images/gjxyuumq10.js">
</script>
<script type="text/javascript">
function setShare(title, url) {
var div = document.createElement('div');
div.innerHTML = '<a href="' + url + '"></a>';
jiathis_config.title = title;
jiathis_config.url = div.firstChild.href;
div = null;
}
var jiathis_config = {}
</script>
</body>
</html>