diff --git a/src/components/UploadUnit/UploadUnit.js b/src/components/UploadUnit/UploadUnit.js
index 15f7b83..f786a88 100644
--- a/src/components/UploadUnit/UploadUnit.js
+++ b/src/components/UploadUnit/UploadUnit.js
@@ -1,10 +1,14 @@
import './upload.css';
-import { Component, Fragment } from "react";
+import { Component, createRef, Fragment } from "react";
import { apis } from '../../helper/apis';
import Spinner from '../Spinner/Spinner';
export default class UploadUnit extends Component {
+ imgRef = createRef();
+ imgWidth;
+ imgHeight;
+
constructor(props) {
super(props);
this.state = {
@@ -13,10 +17,14 @@ export default class UploadUnit extends Component {
src: null,
file: null,
progress: 0,
- width: 0
+ width: 0,
+ isScaled: false,
+ transform: ''
};
this.upload = this.upload.bind(this);
this.handleCancel = this.handleCancel.bind(this);
+ this.scale = this.scale.bind(this);
+ this.unscale = this.unscale.bind(this);
}
componentDidMount() {
@@ -73,10 +81,12 @@ export default class UploadUnit extends Component {
}
canvas.width = width;
canvas.height = height;
+ this.imgWidth = width;
+ this.imgHeight = height;
canvas.getContext('2d').drawImage(img, 0, 0, width, height);
canvas.toBlob(blob => {
- this.setState({ src: canvas.toDataURL('image/jpeg', 0.8), status: 2, file: blob, width: width / height * 200 });
- }, 'image/jpeg', 0.8);
+ this.setState({ src: canvas.toDataURL('image/jpeg', 1), status: 2, file: blob, width: width / height * 200 });
+ }, 'image/jpeg', 1);
}
async upload() {
@@ -119,13 +129,41 @@ export default class UploadUnit extends Component {
this.setState({ status: 3, progress: 0 });
}
+ scale() {
+ if (this.state.isScaled) return;
+ let el = this.imgRef.current;
+ let { x, y } = el.getBoundingClientRect();
+ let { innerWidth, innerHeight } = window;
+ console.log(x, y, innerWidth, innerHeight);
+ let initialScale = 200 / this.imgHeight,
+ terminalScale = Math.min(1, Math.min(innerWidth / this.imgWidth, innerHeight / this.imgHeight));
+ this.setState({ transform: `translate(${x - (innerWidth - this.imgWidth * terminalScale) / 2}px, ${y - (innerHeight - this.imgHeight * terminalScale) / 2}px) scale(${initialScale})`, isScaled: true });
+ setTimeout(() => {
+ this.setState({ transform: `translate(0, 0) scale(${terminalScale})` });
+ }, 0);
+ }
+
+ unscale() {
+ if (!this.state.isScaled) return;
+ let el = this.imgRef.current;
+ let { x, y } = el.getBoundingClientRect();
+ let { innerWidth, innerHeight } = window;
+ let initialScale = 200 / this.imgHeight,
+ terminalScale = Math.min(1, Math.min(innerWidth / this.imgWidth, innerHeight / this.imgHeight));
+ this.setState({ transform: `translate(${x - (innerWidth - this.imgWidth * terminalScale) / 2}px, ${y - (innerHeight - this.imgHeight * terminalScale) / 2}px) scale(${initialScale})`, isScaled: true });
+ setTimeout(() => {
+ this.setState({ isScaled: false });
+ }, 300);
+ }
+
render() {
const angle = this.state.progress / 100 * Math.PI * 2;
+ console.log(this.state.transform);
return (
{this.state.src
- ?

+ ?

: null
}
{this.state.status >= 0
@@ -173,7 +211,7 @@ export default class UploadUnit extends Component {
}
{this.state.status === 2 || this.state.status === 4
? (
-
+
+

+
);
}
diff --git a/src/components/UploadUnit/upload.css b/src/components/UploadUnit/upload.css
index c107e24..4017da3 100644
--- a/src/components/UploadUnit/upload.css
+++ b/src/components/UploadUnit/upload.css
@@ -79,4 +79,24 @@
to {
filter: opacity(1);
}
+}
+
+.scaled-wrap {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ align-items: center;
+ justify-content: center;
+ display: none;
+ z-index: 1;
+}
+.scaled-wrap.open {
+ display: flex;
+ background-color: #0008;
+}
+.scaled-wrap > img {
+ transition: transform .3s ease-out;
+ transform-origin: top left;
}
\ No newline at end of file
diff --git a/src/components/UserControl/UserControl.js b/src/components/UserControl/UserControl.js
index bda17fc..064ad59 100644
--- a/src/components/UserControl/UserControl.js
+++ b/src/components/UserControl/UserControl.js
@@ -5,6 +5,7 @@ import Spinner from '../Spinner/Spinner';
import { get } from '../../helper/axios';
import { apis } from '../../helper/apis';
import { alert } from '../../helper/alert';
+import History from '../../helper/history';
export default function UserControl(props) {
return (
@@ -33,6 +34,8 @@ export default function UserControl(props) {
{userData.name || "加载中"}
{
(() => {
+ if (userData.role !== 2 && History.getHref().match(/^\/admin.*/))
+ History.force('/');
if (userData.role !== -1) return null;
get(apis.getProfile).then(({ data, status, networkStatus }) => {
if (networkStatus !== 200) return;
diff --git a/src/helper/alert.js b/src/helper/alert.js
index 5a5a2e9..a56fdfc 100644
--- a/src/helper/alert.js
+++ b/src/helper/alert.js
@@ -2,11 +2,10 @@ import Swal from 'sweetalert2';
const SelfSwal = Swal.mixin({
customClass: {
- confirmButton: 'btn-round-full-single',
- cancelButton: 'btn-round-full-single',
+ confirmButton: 'btn btn-primary',
+ cancelButton: 'btn btn-gray',
},
buttonsStyling: false,
- heightAuto: false
});
// ajax
diff --git a/src/helper/axios.js b/src/helper/axios.js
index 454c358..871842f 100644
--- a/src/helper/axios.js
+++ b/src/helper/axios.js
@@ -11,7 +11,7 @@ export function get(url) {
"Allow-Control-Allow-Origin": "*"
}
}),
- () => get(url)
+ () => ({ fn: get(url), identifier: 'get:' + url })
);
}
export function post(url, data) {
@@ -22,15 +22,16 @@ export function post(url, data) {
"Allow-Control-Allow-Origin": "*"
}
}),
- () => post(url, data)
+ () => ({ fn: post(url, data), identifier: 'post:' + url + ' ' + JSON.stringify(data) })
);
}
const waitToSend = [];
-async function send(xhr, retryFunc) {
+async function send(xhr, retryConf) {
if (waitToSend.length) {
- waitToSend.push(retryFunc);
+ if (waitToSend.every(retryConfItem => retryConfItem.identifier !== retryConf.identifier))
+ waitToSend.push(retryConf);
return;
}
try {
@@ -50,7 +51,7 @@ async function send(xhr, retryFunc) {
History.force('/login');
return failData;
}
- waitToSend.push(retryFunc);
+ waitToSend.push(retryConf);
if (err.message === 'Network Error')
return await failed('您的设备似乎断网了,请检查网络后重试或刷新', flushWaitList) || failData;
if (err?.response?.status === 504)
diff --git a/src/upload/upload.js b/src/upload/upload.js
index 3e2d832..2c7f36e 100644
--- a/src/upload/upload.js
+++ b/src/upload/upload.js
@@ -44,7 +44,10 @@ export class UploadContainer extends Component {
post(apis.submitMessage, { content: this.state.msg, image: this.state.url })
.then(({ data, status, networkStatus }) => {
if (networkStatus !== 200) return;
- if (!status) return alert('提交内容失败:' + data);
+ if (!status) {
+ this.setState({ submitting: false });
+ return alert('提交内容失败:' + data);
+ }
this.setState({ submitting: false, msg: "", url: "", file: null });
alert('内容提交成功啦').then(({ isConfirmed }) => {
if (isConfirmed) window.close();