<template>
	<div>
		<el-container>
			<el-main>
				<el-form :inline="true" :model="formInline" class="demo-form-inline">
					<el-form-item>
						<el-input size="small" clearable v-model="formInline.userName" placeholder="请输入用户名" @keydown.enter.native="userPage"></el-input>
					</el-form-item>
					<el-form-item>
						<el-input size="small" clearable v-model="formInline.nickName" placeholder="请输入用户昵称" @keydown.enter.native="userPage"></el-input>
					</el-form-item>
					<el-form-item>
						<el-select size="small" v-model="formInline.userWeight" placeholder="请选择权重" @change="userPage">
							<el-option v-for="item in allOptions" :key="item.type" :label="item.name" :value="item.type"></el-option>
						</el-select>
					</el-form-item>

					<el-form-item>
						<el-select size="small" v-model="formInline.articleType" placeholder="请选择文章类型" @change="userPage">
							<el-option v-for="type in articleType" :key="type" :label="type" :value="type"></el-option>
						</el-select>
					</el-form-item>
					<el-form-item>
						<el-select size="small" v-model="formInline.likeStatus" placeholder="请选择点赞状态" @change="userPage">
							<el-option v-for="item in likeStatus" :key="item.type" :label="item.name" :value="item.type"></el-option>
						</el-select>
					</el-form-item>
					<el-form-item>
						<el-select size="small" v-model="formInline.collectStatus" placeholder="请选择收藏状态" @change="userPage">
							<el-option v-for="item in collectStatus" :key="item.type" :label="item.name" :value="item.type"></el-option>
						</el-select>
					</el-form-item>

					<el-form-item>
						<el-select size="small" v-model="formInline.commentStatus" placeholder="请选择评论状态" @change="userPage">
							<el-option v-for="item in commentStatus" :key="item.type" :label="item.name" :value="item.type"></el-option>
						</el-select>
					</el-form-item>

					<br />
					<el-form-item>
						<el-button size="small" type="primary" @click="userPage">查询</el-button>
					</el-form-item>
					<el-form-item>
						<el-button size="small" type="primary" @click="prepareAdd">新增</el-button>
						<el-dialog title="新增用户" :visible.sync="dialogFormVisible" style="width: 100%">
							<el-form :model="form" class="custom-form">
								<el-form-item label="用户名称" :label-width="formLabelWidth" class="form-item">
									<el-input v-model="form.userName" autocomplete="off" style="width: 100%"></el-input>
								</el-form-item>
								<br />
								<el-form-item label="用户昵称" :label-width="formLabelWidth" class="form-item">
									<el-input v-model="form.nickName" autocomplete="off" style="width: 100%"></el-input>
								</el-form-item>
								<br />
								<el-form-item label="用户权重" :label-width="formLabelWidth" class="form-item">
									<el-select v-model="form.userWeight" placeholder="请选择">
										<el-option v-for="item in allOptions" :key="item.type" :label="item.name" :value="item.type"></el-option>
									</el-select>
								</el-form-item>
							</el-form>
							<div slot="footer" class="dialog-footer">
								<el-button @click="dialogFormVisible = false">取 消</el-button>
								<el-button type="primary" @click="handleConfirm(0)">确 定</el-button>
							</div>
						</el-dialog>
					</el-form-item>
					<el-form-item>
						<el-button size="small" type="primary" @click="prepareMutiAdd">批量新增</el-button>
						<el-dialog class="red-title" :visible.sync="dialogMutiFormVisible">
							<div class="red-title" slot="title">批量新增用户(多个用户换行填写)</div>
							<el-form :model="form" class="custom-form">
								<el-form-item label="用户名称" :label-width="formLabelWidth" class="form-item">
									<el-input type="textarea" v-model="form.userName" autocomplete="off" :rows="5" :cols="30" style="width: 100%"></el-input>
								</el-form-item>
							</el-form>
							<div slot="footer" class="dialog-footer">
								<el-button @click="dialogMutiFormVisible = false">取 消</el-button>
								<el-button type="primary" @click="handleConfirm(1)">确 定</el-button>
							</div>
						</el-dialog>
					</el-form-item>
					<el-form-item>
						<el-button size="small" type="primary" @click="prepareResetUser">新的一天</el-button>
					</el-form-item>
					<el-dialog title="提示" :visible.sync="resetUserDialogVisible" width="30%" :before-close="handleClose">
						<span>确认重置新一天用户状态吗?</span>
						<span slot="footer" class="dialog-footer">
							<el-button @click="resetUserDialogVisible = false">取 消</el-button>
							<el-button type="primary" @click.prevent="resetUser()">确 定</el-button>
						</span>
					</el-dialog>
					<el-form-item>
						<el-button size="small" type="primary" @click="prepareAllTriplet">三连</el-button>
					</el-form-item>
					<el-dialog title="提示" :visible.sync="allTripletDialogVisible" width="30%" :before-close="handleClose">
						<span>确认三连吗?</span>
						<span slot="footer" class="dialog-footer">
							<el-button @click="allTripletDialogVisible = false">取 消</el-button>
							<el-button type="primary" @click.prevent="allTriplet()">确 定</el-button>
						</span>
					</el-dialog>
					<el-form-item>
						<el-button size="small" type="warning" @click="prepareReset">重置状态</el-button>
					</el-form-item>
					<el-dialog title="提示" :visible.sync="resetDialogVisible" width="30%" :before-close="handleClose">
						<span>确认重置状态吗?</span>
						<span slot="footer" class="dialog-footer">
							<el-button @click="resetDialogVisible = false">取 消</el-button>
							<el-button type="primary" @click.prevent="reset()">确 定</el-button>
						</span>
					</el-dialog>
					<el-form-item>
						<el-button size="small" type="success" @click="prepareAutoReply">自动评论</el-button>
					</el-form-item>
					<el-dialog title="提示" :visible.sync="autoReplyDialogVisible" width="30%" :before-close="handleClose">
						<span>确认自动评论吗?</span>
						<span slot="footer" class="dialog-footer">
							<el-button @click="autoReplyDialogVisible = false">取 消</el-button>
							<el-button type="primary" @click.prevent="autoReply()">确 定</el-button>
						</span>
					</el-dialog>
				</el-form>
				<el-table ref="multipleTable" v-loading="loading" :data="csdnUserList" tooltip-effect="dark" style="width: 100%" @selection-change="handleSelectionChange">
					<el-table-column type="selection" width="55"></el-table-column>
					<el-table-column prop="userName" label="用户名称" show-overflow-tooltip></el-table-column>
					<el-table-column prop="nickName" label="用户昵称" show-overflow-tooltip>
						<template slot-scope="scope">
							<a :href="scope.row.userHomeUrl" target="_blank">{{ scope.row.nickName }}</a>
						</template>
					</el-table-column>

					<el-table-column prop="likeStatusName" label="点赞状态" show-overflow-tooltip>
						<template slot-scope="scope">
							<el-tag :type="getTagType(scope.row.likeStatusName)">{{ scope.row.likeStatusName }}</el-tag>
						</template>
					</el-table-column>

					<el-table-column prop="collectStatusName" label="收藏状态" show-overflow-tooltip>
						<template slot-scope="scope">
							<el-tag :type="getTagType(scope.row.collectStatusName)">{{ scope.row.collectStatusName }}</el-tag>
						</template>
					</el-table-column>

					<el-table-column prop="commentStatusName" label="评论状态" show-overflow-tooltip>
						<template slot-scope="scope">
							<el-tag :type="getTagType(scope.row.commentStatusName)">{{ scope.row.commentStatusName }}</el-tag>
						</template>
					</el-table-column>

					<el-table-column prop="userWeightName" label="用户权重" show-overflow-tooltip></el-table-column>

					<el-table-column prop="articleType" label="文章类型" show-overflow-tooltip></el-table-column>
					<el-table-column label="更新时间">
						<template slot-scope="props">
							{{ props.row.updateTime | dateFormat }}
						</template>
					</el-table-column>
					<el-table-column prop="操作" label="操作" width="380px">
						<template slot-scope="props">
							<el-button type="primary" @click="prepareTriplet(props.row.userName)" size="small">三连</el-button>
							<el-dialog title="提示" :visible.sync="tripletVisible" width="30%" :before-close="handleClose">
								<span>确认三连?</span>
								<span slot="footer" class="dialog-footer">
									<el-button @click="tripletVisible = false">取 消</el-button>
									<el-button type="primary" @click.prevent="triplet(currentUserName)">确 定</el-button>
								</span>
							</el-dialog>
							<el-button type="warning" @click="prepareResetUserDayStatus(props.row.userName)" size="small">重置</el-button>
							<el-dialog title="提示" :visible.sync="resetUserDayStatusVisible" width="30%" :before-close="handleClose">
								<span>确认重置?</span>
								<span slot="footer" class="dialog-footer">
									<el-button @click="resetUserDayStatusVisible = false">取 消</el-button>
									<el-button type="primary" @click.prevent="resetUserDayStatus(currentUserName)">确 定</el-button>
								</span>
							</el-dialog>
							<el-button type="success" @click.prevent="preEdit(props.row.id, props.row.userName, props.row.nickName, props.row.userHomeUrl, props.row.userWeight)" width="200" size="small">编辑</el-button>
							<el-dialog title="编辑用户信息" :visible.sync="editVisible">
								<el-form :model="form">
									<el-form-item label="用户名称" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.userName" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>
									<el-form-item label="用户昵称" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.nickName" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>
									<el-form-item label="用户主页" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.userHomeUrl" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>
									<el-form-item label="用户权重" :label-width="formLabelWidth" class="form-item">
										<el-select v-model="form.userWeight" placeholder="请选择">
											<el-option v-for="item in allOptions" :key="item.type" :label="item.name" :value="item.type"></el-option>
										</el-select>
									</el-form-item>
								</el-form>
								<div slot="footer" class="dialog-footer">
									<el-button @click="editVisible = false">取 消</el-button>
									<el-button type="primary" @click="editConfirm">确 定</el-button>
								</div>
							</el-dialog>
							<el-button type="danger" @click="prepareBlog10(props.row.userName)" size="small">十篇</el-button>
							<el-dialog title="提示" :visible.sync="blog10DialogVisible" width="30%" :before-close="handleClose">
								<span>确认此用户添加10篇三连文章吗?</span>
								<span slot="footer" class="dialog-footer">
									<el-button @click="blog10DialogVisible = false">取 消</el-button>
									<el-button type="primary" @click.prevent="onBlog10(currentUserName)">确 定</el-button>
								</span>
							</el-dialog>
							<el-button type="danger" @click="prepareDelete(props.row.id)" size="small">删除</el-button>
							<el-dialog title="提示" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
								<span>确认删除?</span>
								<span slot="footer" class="dialog-footer">
									<el-button @click="dialogVisible = false">取 消</el-button>
									<el-button type="primary" @click.prevent="onDelete(currentRowId)">确 定</el-button>
								</span>
							</el-dialog>
						</template>
					</el-table-column>
				</el-table>
				<el-pagination class="pagination" background :key="elementui_page_component_key" :current-page.sync="currentPage" :page-size="pageSize" :total="total" @current-change="handleCurrentChange"></el-pagination>
			</el-main>
			<el-backtop class="backtop"></el-backtop>
		</el-container>
	</div>
</template>

<script>
import axios from 'axios'
export default {
	name: 'MyCsdnUser',

	data() {
		return {
			form: {
				userName: '',
				nickName: '',
				userHomeUrl: '',
				userWeight: null,
			},
			formInline: {
				userName: '',
				nickName: '',
				articleType: 'blog',
				likeStatus: null,
				collectStatus: null,
				commentStatus: null,
			},
			allOptions: [
				{
					// type: -1,
					name: '全部',
				},
				{
					type: 9,
					name: '铁子',
				},
				{ type: 8, name: '闺蜜' },
				{ type: 7, name: '基友' },
				{ type: 0, name: '默认' },
			],
			articleType: ['全部', 'blog', 'blink', 'download', 'ask'],
			likeStatus: [
				{
					type: -1,
					name: '全部',
				},
				{
					type: 0,
					name: '未处理',
				},
				{ type: 1, name: '已经点过赞' },
				{ type: 2, name: '点赞已满' },
				{ type: 3, name: '取消点赞' },
				{ type: 9, name: '点赞成功' },
			],
			collectStatus: [
				{
					type: -1,
					name: '全部',
				},
				{
					type: 0,
					name: '未处理',
				},
				{ type: 1, name: '已经收藏过' },
				{ type: 2, name: '收藏已满' },
				{ type: 3, name: '参数缺失' },
				{ type: 9, name: '收藏成功' },
			],
			commentStatus: [
				{
					type: -1,
					name: '全部',
				},
				{
					type: 0,
					name: '未处理',
				},
				{ type: 1, name: '已经评论过' },
				{ type: 2, name: '评论已满' },
				{ type: 3, name: '禁言' },
				{ type: 4, name: '评论太快' },
				{ type: 5, name: '评论已经到了49条' },
				{ type: 8, name: '其他错误' },
				{ type: 9, name: '评论成功' },
			],
			dialogFormVisible: false,
			dialogMutiFormVisible: false,
			dialogVisible: false,
			editVisible: false,
			tripletVisible: false,
			allTripletDialogVisible: false,
			resetDialogVisible: false,
			autoReplyDialogVisible: false,
			resetUserDialogVisible: false,
			resetUserDayStatusVisible: false,
			blog10DialogVisible: false,
			// 用户列表数据
			csdnUserList: [],
			loading: false,
			elementui_page_component_key: 0,
			currentPage: Number(localStorage.getItem('csdnUserPage')) || 1,
			pageSize: 10,
			total: 0,
			// 新增的内容
			formLabelWidth: '120px',
			currentRowId: null,
			currentUserName: null,
			multipleSelection: [],
		}
	},
	watch: {
		'formInline.userName'(newVal, oldVal) {
			if (newVal !== oldVal) {
				this.currentPage = 1
				localStorage.setItem('csdnUserPage', this.currentPage)
				this.userPage()
			}
		},
		'formInline.nickName'(newVal, oldVal) {
			if (newVal !== oldVal) {
				this.currentPage = 1
				localStorage.setItem('csdnUserPage', this.currentPage)
				this.userPage()
			}
		},
		// 监听currentPage的变化，将新值保存到localStorage中
		currentPage(newPage) {
			localStorage.setItem('csdnUserPage', newPage.toString())
		},
	},
	created() {
		//获取问题类型的枚举
		this.userPage()
	},
	mounted() {
		this.currentPage = 1
	},
	methods: {
		prepareAdd() {
			this.form.userName = ''
			this.form.nickName = ''
			this.dialogFormVisible = true
		},
		prepareAllTriplet() {
			this.allTripletDialogVisible = true
		},
		prepareResetUserDayStatus(userName) {
			this.resetUserDayStatusVisible = true
			this.currentUserName = userName
		},
		prepareBlog10(userName) {
			this.blog10DialogVisible = true
			this.currentUserName = userName
		},
		prepareReset() {
			this.resetDialogVisible = true
		},
		prepareAutoReply() {
			this.autoReplyDialogVisible = true
		},
		prepareResetUser() {
			this.resetUserDialogVisible = true
		},
		prepareMutiAdd() {
			this.form.userName = ''
			this.dialogMutiFormVisible = true
		},
		prepareDelete(id) {
			this.currentRowId = id
			this.dialogVisible = true
		},
		prepareTriplet(userName) {
			this.currentUserName = userName
			this.tripletVisible = true
		},
		preEdit(id, userName, nickName, userHomeUrl, userWeight) {
			this.form.userName = userName
			this.form.nickName = nickName
			this.form.userHomeUrl = userHomeUrl
			this.form.userWeight = userWeight
			this.currentRowId = id
			this.editVisible = true
		},
		handleClose(done) {
			this.$confirm('确认关闭？')
				.then((_) => {
					done()
				})
				.catch((_) => {})
		},
		handleConfirm(addType) {
			this.dialogFormVisible = false // 关闭对话框
			this.dialogMutiFormVisible = false
			this.addUser(addType) // 发送请求
		},
		handleSelectionChange(val) {
			this.multipleSelection = val
		},

		async addUser(addType) {
			try {
				this.loading = true
				const { data: res } = await axios.post('http://120.79.36.53:8888/csdn/user/add', {
					addType: addType,
					userName: this.form.userName,
					nickName: this.form.nickName,
					userWeight: this.form.userWeight,
				})
				if (res.code === 200) {
					this.currentPage = 1
					this.form.userName = ''
					this.form.nickName = ''
					this.form.userWeight = null
					this.userPage()
				} else {
					this.errorMsg(res.message)
					console.error('Received non-200 status code', res)
				}
			} catch (error) {
				console.error('An error occurred while adding the questionName:', error)
				// 异常处理逻辑
			} finally {
				this.loading = false
			}
		},
		errorMsg(msg) {
			this.$message({
				showClose: true,
				message: msg,
				type: 'error',
			})
		},
		async editConfirm() {
			try {
				this.loading = true
				const { data: res } = await axios.post('http://120.79.36.53:8888/csdn/user/update', {
					id: this.currentRowId,
					userName: this.form.userName,
					nickName: this.form.nickName,
					userWeight: this.form.userWeight,
					userHomeUrl: this.form.userHomeUrl,
				})
				if (res.code === 200) {
					this.form.userName = ''
					this.form.nickName = ''
					this.form.userHomeUrl = ''
					this.form.userWeight = null
					this.editVisible = false
					currentRowId: null
					this.userPage()
				} else {
					console.error('Received non-200 status code', res)
				}
			} catch (error) {
				console.error('An error occurred while adding the questionName:', error)
				// 异常处理逻辑
			} finally {
				this.loading = false
			}
		},
		async autoReply() {
			this.loading = true
			this.autoReplyDialogVisible = false
			const { data: res } = await axios.get('http://120.79.36.53:8888/csdn/autoReply')
			if (res.code === 200) {
				this.userPage()
			} else {
				console.error('Received non-200 status code', res)
			}
			this.loading = false
		},
		async allTriplet() {
			this.loading = true
			this.allTripletDialogVisible = false
			if (this.multipleSelection && this.multipleSelection.length === 0) {
				console.error('请选择需要处理的项')
			} else {
				let userNames = this.multipleSelection.map((item) => item.userName)
				const { data: res } = await axios.post('http://120.79.36.53:8888/csdn/multiTriplet', userNames)
				if (res.code === 200) {
					this.multipleSelection = []
					this.userPage()
				} else {
					console.error('Received non-200 status code', res)
				}
			}
			this.loading = false
		},
		async triplet(userName) {
			this.loading = true
			this.tripletVisible = false
			const { data: res } = await axios.get('http://120.79.36.53:8888/csdn/singleTriplet?username=' + userName)
			if (res.code === 200) {
				this.currentUserName = null
				this.userPage()
			} else {
				console.error('Received non-200 status code', res)
			}
			this.loading = false
		},
		async onBlog10(userName) {
			this.loading = true
			const { data: res } = await axios.get('http://120.79.36.53:8888/csdn/add10Blog?username=' + userName)
			if (res.code === 200) {
				this.currentUserName = null
				this.blog10DialogVisible = false
				this.userPage()
			} else {
				console.error('Received non-200 status code', res)
			}
			this.loading = false
		},
		async resetUserDayStatus(userName) {
			this.loading = true
			this.resetUserDayStatusVisible = false
			const { data: res } = await axios.get('http://120.79.36.53:8888/csdn/resetCsdnUserInfo?username=' + userName)
			if (res.code === 200) {
				this.currentUserName = null
				this.userPage()
			} else {
				console.error('Received non-200 status code', res)
			}
			this.loading = false
		},
		async onDelete(id) {
			this.loading = true
			const { data: res } = await axios.get('http://120.79.36.53:8888/csdn/user/delete', {
				params: {
					id: id,
				},
			})
			this.dialogVisible = false
			this.userPage()
			this.loading = false
		},
		async reset() {
			this.loading = true
			this.resetDialogVisible = false
			if (this.multipleSelection && this.multipleSelection.length === 0) {
				console.error('请选择需要处理的项')
			} else {
				let userNames = this.multipleSelection.map((item) => item.userName)
				console.log(userNames)
				const { data: res } = await axios.post('http://120.79.36.53:8888/csdn/resetCsdnUserInfo', userNames)
				if (res.code === 200) {
					this.multipleSelection = []
					this.userPage()
				} else {
					console.error('Received non-200 status code', res)
				}
			}
			this.loading = false
		},
		async resetUser() {
			this.loading = true
			const { data: res } = await axios.get('http://120.79.36.53:8888/csdn/resetUserDayStatus')
			this.resetUserDialogVisible = false
			this.userPage()
			this.loading = false
		},
		refreshPage() {
			//获取问题类型的枚举
			this.userPage()
			location.reload()
		},
		async userPage() {
			this.loading = true
			const { data: res } = await axios.post('http://120.79.36.53:8888/csdn/user/page', {
				page: this.currentPage,
				pageSize: this.pageSize,
				userName: this.formInline.userName,
				nickName: this.formInline.nickName,
				articleType: this.formInline.articleType == '全部' ? '' : this.formInline.articleType,
				userWeight: this.formInline.userWeight == -1 ? null : this.formInline.userWeight,
				likeStatus: this.formInline.likeStatus == -1 ? null : this.formInline.likeStatus,
				collectStatus: this.formInline.collectStatus == -1 ? null : this.formInline.collectStatus,
				commentStatus: this.formInline.commentStatus == -1 ? null : this.formInline.commentStatus,
			})
			if (res.code === 200) {
				this.total = res.result.totalElements

				const userWeightMap = {}
				this.allOptions.forEach((option) => {
					userWeightMap[option.type] = option.name
				})
				res.result.content.forEach((item) => {
					item.userWeightName = userWeightMap[item.userWeight]
				})

				const likeStatusMap = {}
				this.likeStatus.forEach((option) => {
					likeStatusMap[option.type] = option.name
				})
				res.result.content.forEach((item) => {
					item.likeStatusName = likeStatusMap[item.likeStatus]
				})

				const collectStatusMap = {}
				this.collectStatus.forEach((option) => {
					collectStatusMap[option.type] = option.name
				})
				res.result.content.forEach((item) => {
					item.collectStatusName = collectStatusMap[item.collectStatus]
				})

				const commentStatusMap = {}
				this.commentStatus.forEach((option) => {
					commentStatusMap[option.type] = option.name
				})
				res.result.content.forEach((item) => {
					item.commentStatusName = commentStatusMap[item.commentStatus]
				})

				this.csdnUserList = res.result.content
			}
			this.loading = false
		},
		handleCurrentChange(currentPage) {
			this.currentPage = currentPage
			this.userPage()
		},
		getTagType(statusName) {
			if (statusName == '未处理') {
				return 'info'
			} else if (statusName == '已经点过赞' || statusName == '已经收藏过' || statusName == '已经评论过') {
				return 'success'
			} else if (statusName == '点赞已满' || statusName == '收藏已满' || statusName == '评论已满' || statusName == '禁言' || statusName == '评论已经到了49条') {
				return 'danger'
			} else if (statusName == '点赞成功' || statusName == '收藏成功' || statusName == '评论成功') {
				return 'success'
			} else if (statusName == '参数缺失' || statusName == '其他错误' || statusName == '取消点赞' || statusName == '评论太快') {
				return 'warning'
			}
		},
	},
}
</script>

<style lang="less" scoped>
.el-header {
	background-color: #b3c0d1;
	color: #333;
	line-height: 60px;
}

.el-aside {
	color: #333;
}

.pagination {
	margin-top: 16px;
	text-align: right;
}
.header-button-item {
	margin-right: 15px;
	font-size: 20px;
}

.red-title {
	line-height: 24px;
	font-size: 18px;
	color: red;
}

.backtop {
	position: fixed;
	bottom: 50px;
	right: 50px;
	height: 40px;
	width: 40px;
	line-height: 40px;
	text-align: center;
	border-radius: 20px;
	background-color: #007aff;
	color: #fff;
	cursor: pointer;
	z-index: 999;
}
.custom-textarea {
	width: 100%;
	text-align: left;
}
.backtop:hover {
	background-color: #0050a0;
}
</style>