🎉初版支持自动推送
This commit is contained in:
commit
d61a40e7c0
|
@ -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/
|
|
@ -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.
|
|
@ -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)
|
|
@ -0,0 +1,6 @@
|
||||||
|
from typing import List
|
||||||
|
from pydantic import BaseModel, Extra
|
||||||
|
|
||||||
|
|
||||||
|
class Config(BaseModel, extra=Extra.ignore):
|
||||||
|
notice_pusher_enable: List = []
|
|
@ -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
|
|
@ -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)
|
|
@ -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
|
|
@ -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()
|
|
@ -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条 1/29 </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> <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("wburl", 1390296022, 14711)">· 国际交流处</a></li>
|
||||||
|
<li><a target="_blank" href="http://www.csust.edu.cn/wgyxy/index.htm" title=""
|
||||||
|
onclick="_addDynClicks("wburl", 1390296022, 14712)">· 外国语学院</a></li>
|
||||||
|
<li><a target="_blank" href="http://www.csust.edu.cn/xsgzb/index.htm" title=""
|
||||||
|
onclick="_addDynClicks("wburl", 1390296022, 14715)">· 学生工作部</a></li>
|
||||||
|
<li><a target="_blank" href="http://www.csust.edu.cn/xtw/index.htm" title=""
|
||||||
|
onclick="_addDynClicks("wburl", 1390296022, 14716)">· 校团委</a></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="links">
|
||||||
|
<li><a target="_blank" href="http://www.hanban.edu.cn/" title=""
|
||||||
|
onclick="_addDynClicks("wburl", 1390296022, 14718)">· 孔子学院总部/国家汉办</a></li>
|
||||||
|
<li><a target="_blank" href="http://www.csc.edu.cn/" title=""
|
||||||
|
onclick="_addDynClicks("wburl", 1390296022, 14721)">· 国家留学网</a></li>
|
||||||
|
<li><a target="_blank" href="http://www.jsj.edu.cn/" title=""
|
||||||
|
onclick="_addDynClicks("wburl", 1390296022, 14722)">· 中外合作办学监管网</a></li>
|
||||||
|
<li><a target="_blank" href="http://www.chinesetest.cn/index.do" title=""
|
||||||
|
onclick="_addDynClicks("wburl", 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">电话:(+86)731-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 © 2015-2018 All Right
|
||||||
|
Reserved 长沙理工大学国际工学院版权所有
|
||||||
|
<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>
|
Loading…
Reference in New Issue