update: backend language and order result page

This commit is contained in:
tokumeikoi 2021-01-20 19:51:55 +09:00
parent edee396c9b
commit f7a7c21c16
21 changed files with 280 additions and 292 deletions

View File

@ -20,6 +20,7 @@ class AuthController extends Controller
{ {
public function register(AuthRegister $request) public function register(AuthRegister $request)
{ {
abort(500, __('passport.auth.register.verify_incorrect'));
if ((int)config('v2board.recaptcha_enable', 0)) { if ((int)config('v2board.recaptcha_enable', 0)) {
$recaptcha = new ReCaptcha(config('v2board.recaptcha_key')); $recaptcha = new ReCaptcha(config('v2board.recaptcha_key'));
$recaptchaResp = $recaptcha->verify($request->input('recaptcha_data')); $recaptchaResp = $recaptcha->verify($request->input('recaptcha_data'));

View File

@ -11,25 +11,25 @@ class CouponController extends Controller
public function check(Request $request) public function check(Request $request)
{ {
if (empty($request->input('code'))) { if (empty($request->input('code'))) {
abort(500, '优惠券码不能为空'); abort(500, __('user.coupon.check.coupon_not_empty'));
} }
$coupon = Coupon::where('code', $request->input('code'))->first(); $coupon = Coupon::where('code', $request->input('code'))->first();
if (!$coupon) { if (!$coupon) {
abort(500, '优惠券无效'); abort(500, __('user.coupon.check.coupon_invalid'));
} }
if ($coupon->limit_use <= 0 && $coupon->limit_use !== NULL) { if ($coupon->limit_use <= 0 && $coupon->limit_use !== NULL) {
abort(500, '优惠券已无可用次数'); abort(500, __('user.coupon.check.coupon_not_available_by_number'));
} }
if (time() < $coupon->started_at) { if (time() < $coupon->started_at) {
abort(500, '优惠券还未到可用时间'); abort(500, __('user.coupon.check.coupon_not_available_by_time'));
} }
if (time() > $coupon->ended_at) { if (time() > $coupon->ended_at) {
abort(500, '优惠券已过期'); abort(500, __('user.coupon.check.coupon_expired'));
} }
if ($coupon->limit_plan_ids) { if ($coupon->limit_plan_ids) {
$limitPlanIds = json_decode($coupon->limit_plan_ids); $limitPlanIds = json_decode($coupon->limit_plan_ids);
if (!in_array($request->input('plan_id'), $limitPlanIds)) { if (!in_array($request->input('plan_id'), $limitPlanIds)) {
abort(500, '这个计划无法使用该优惠码'); abort(500, __('user.coupon.check.coupon_limit_plan'));
} }
} }
return response([ return response([

View File

@ -14,7 +14,7 @@ class InviteController extends Controller
public function save(Request $request) public function save(Request $request)
{ {
if (InviteCode::where('user_id', $request->session()->get('id'))->where('status', 0)->count() >= config('v2board.invite_gen_limit', 5)) { if (InviteCode::where('user_id', $request->session()->get('id'))->where('status', 0)->count() >= config('v2board.invite_gen_limit', 5)) {
abort(500, '已达到创建数量上限'); abort(500, __('user.invite.save.invite_create_limit'));
} }
$inviteCode = new InviteCode(); $inviteCode = new InviteCode();
$inviteCode->user_id = $request->session()->get('id'); $inviteCode->user_id = $request->session()->get('id');

View File

@ -17,11 +17,11 @@ class KnowledgeController extends Controller
->where('show', 1) ->where('show', 1)
->first() ->first()
->toArray(); ->toArray();
if (!$knowledge) abort(500, '知识不存在'); if (!$knowledge) abort(500, __('user.knowledge.fetch.knowledge_not_exist'));
$user = User::find($request->session()->get('id')); $user = User::find($request->session()->get('id'));
$userService = new UserService(); $userService = new UserService();
$appleId = $userService->isAvailable($user) ? config('v2board.apple_id') : '没有有效订阅无法使用本站提供的AppleID'; $appleId = $userService->isAvailable($user) ? config('v2board.apple_id') : __('user.knowledge.fetch.apple_id_must_be_plan');
$appleIdPassword = $userService->isAvailable($user) ? config('v2board.apple_id_password') : '没有有效订阅无法使用本站提供的AppleID'; $appleIdPassword = $userService->isAvailable($user) ? config('v2board.apple_id_password') : __('user.knowledge.fetch.apple_id_must_be_plan');
$subscribeUrl = config('v2board.subscribe_url', config('v2board.app_url', env('APP_URL'))) . '/api/v1/client/subscribe?token=' . $user['token']; $subscribeUrl = config('v2board.subscribe_url', config('v2board.app_url', env('APP_URL'))) . '/api/v1/client/subscribe?token=' . $user['token'];
$knowledge['body'] = str_replace('{{siteName}}', config('v2board.app_name', 'V2Board'), $knowledge['body']); $knowledge['body'] = str_replace('{{siteName}}', config('v2board.app_name', 'V2Board'), $knowledge['body']);
$knowledge['body'] = str_replace('{{appleId}}', $appleId, $knowledge['body']); $knowledge['body'] = str_replace('{{appleId}}', $appleId, $knowledge['body']);

View File

@ -50,12 +50,12 @@ class OrderController extends Controller
->where('trade_no', $request->input('trade_no')) ->where('trade_no', $request->input('trade_no'))
->first(); ->first();
if (!$order) { if (!$order) {
abort(500, '订单不存在'); abort(500, __('user.order.details.order_not_exist'));
} }
$order['plan'] = Plan::find($order->plan_id); $order['plan'] = Plan::find($order->plan_id);
$order['try_out_plan_id'] = (int)config('v2board.try_out_plan_id'); $order['try_out_plan_id'] = (int)config('v2board.try_out_plan_id');
if (!$order['plan']) { if (!$order['plan']) {
abort(500, '订阅不存在'); abort(500, __('user.order.details.plan_not_exist'));
} }
return response([ return response([
'data' => $order 'data' => $order
@ -66,38 +66,38 @@ class OrderController extends Controller
{ {
$userService = new UserService(); $userService = new UserService();
if ($userService->isNotCompleteOrderByUserId($request->session()->get('id'))) { if ($userService->isNotCompleteOrderByUserId($request->session()->get('id'))) {
abort(500, '您有未付款或开通中的订单,请稍后或取消再试'); abort(500, __('user.order.save.exist_open_order'));
} }
$plan = Plan::find($request->input('plan_id')); $plan = Plan::find($request->input('plan_id'));
$user = User::find($request->session()->get('id')); $user = User::find($request->session()->get('id'));
if (!$plan) { if (!$plan) {
abort(500, '该订阅不存在'); abort(500, __('user.order.save.plan_not_exist'));
} }
if ((!$plan->show && !$plan->renew) || (!$plan->show && $user->plan_id !== $plan->id)) { if ((!$plan->show && !$plan->renew) || (!$plan->show && $user->plan_id !== $plan->id)) {
if ($request->input('cycle') !== 'reset_price') { if ($request->input('cycle') !== 'reset_price') {
abort(500, '该订阅已售罄,请更换其他订阅'); abort(500, __('user.order.save.plan_stop_sell'));
} }
} }
if (!$plan->renew && $user->plan_id == $plan->id && $request->input('cycle') !== 'reset_price') { if (!$plan->renew && $user->plan_id == $plan->id && $request->input('cycle') !== 'reset_price') {
abort(500, '该订阅无法续费,请更换其他订阅'); abort(500, __('user.order.save.plan_stop_renew'));
} }
if ($plan[$request->input('cycle')] === NULL) { if ($plan[$request->input('cycle')] === NULL) {
abort(500, '该订阅周期无法进行购买,请选择其他周期'); abort(500, __('user.order.save.plan_stop'));
} }
if ($request->input('cycle') === 'reset_price') { if ($request->input('cycle') === 'reset_price') {
if ($user->expired_at <= time() || !$user->plan_id) { if ($user->expired_at <= time() || !$user->plan_id) {
abort(500, '订阅已过期或无有效订阅,无法购买重置包'); abort(500, __('user.order.save.plan_exist_not_buy_package'));
} }
} }
if (!$plan->show && $plan->renew && !$userService->isAvailable($user)) { if (!$plan->show && $plan->renew && !$userService->isAvailable($user)) {
abort(500, '订阅已过期,请更换其他订阅'); abort(500, __('user.order.save.plan_expired'));
} }
DB::beginTransaction(); DB::beginTransaction();
@ -113,7 +113,7 @@ class OrderController extends Controller
$couponService = new CouponService($request->input('coupon_code')); $couponService = new CouponService($request->input('coupon_code'));
if (!$couponService->use($order)) { if (!$couponService->use($order)) {
DB::rollBack(); DB::rollBack();
abort(500, '优惠券使用失败'); abort(500, __('user.order.save.coupon_use_failed'));
} }
$order->coupon_id = $couponService->getId(); $order->coupon_id = $couponService->getId();
} }
@ -128,14 +128,14 @@ class OrderController extends Controller
if ($remainingBalance > 0) { if ($remainingBalance > 0) {
if (!$userService->addBalance($order->user_id, - $order->total_amount)) { if (!$userService->addBalance($order->user_id, - $order->total_amount)) {
DB::rollBack(); DB::rollBack();
abort(500, '余额不足'); abort(500, __('user.order.save.insufficient_balance'));
} }
$order->balance_amount = $order->total_amount; $order->balance_amount = $order->total_amount;
$order->total_amount = 0; $order->total_amount = 0;
} else { } else {
if (!$userService->addBalance($order->user_id, - $user->balance)) { if (!$userService->addBalance($order->user_id, - $user->balance)) {
DB::rollBack(); DB::rollBack();
abort(500, '余额不足'); abort(500, __('user.order.save.insufficient_balance'));
} }
$order->balance_amount = $user->balance; $order->balance_amount = $user->balance;
$order->total_amount = $order->total_amount - $user->balance; $order->total_amount = $order->total_amount - $user->balance;
@ -144,7 +144,7 @@ class OrderController extends Controller
if (!$order->save()) { if (!$order->save()) {
DB::rollback(); DB::rollback();
abort(500, '订单创建失败'); abort(500, __('user.order.save.order_create_failed'));
} }
DB::commit(); DB::commit();
@ -163,7 +163,7 @@ class OrderController extends Controller
->where('status', 0) ->where('status', 0)
->first(); ->first();
if (!$order) { if (!$order) {
abort(500, '订单不存在或已支付'); abort(500, __('user.order.checkout.order_not_exist_or_paid'));
} }
// free process // free process
if ($order->total_amount <= 0) { if ($order->total_amount <= 0) {
@ -180,7 +180,7 @@ class OrderController extends Controller
case 0: case 0:
// alipayF2F // alipayF2F
if (!(int)config('v2board.alipay_enable')) { if (!(int)config('v2board.alipay_enable')) {
abort(500, '支付方式不可用'); abort(500, __('user.order.checkout.pay_method_not_use'));
} }
return response([ return response([
'type' => 0, 'type' => 0,
@ -189,7 +189,7 @@ class OrderController extends Controller
case 2: case 2:
// stripeAlipay // stripeAlipay
if (!(int)config('v2board.stripe_alipay_enable')) { if (!(int)config('v2board.stripe_alipay_enable')) {
abort(500, '支付方式不可用'); abort(500, __('user.order.checkout.pay_method_not_use'));
} }
return response([ return response([
'type' => 1, 'type' => 1,
@ -198,7 +198,7 @@ class OrderController extends Controller
case 3: case 3:
// stripeWepay // stripeWepay
if (!(int)config('v2board.stripe_wepay_enable')) { if (!(int)config('v2board.stripe_wepay_enable')) {
abort(500, '支付方式不可用'); abort(500, __('user.order.checkout.pay_method_not_use'));
} }
return response([ return response([
'type' => 0, 'type' => 0,
@ -207,7 +207,7 @@ class OrderController extends Controller
case 4: case 4:
// bitpayX // bitpayX
if (!(int)config('v2board.bitpayx_enable')) { if (!(int)config('v2board.bitpayx_enable')) {
abort(500, '支付方式不可用'); abort(500, __('user.order.checkout.pay_method_not_use'));
} }
return response([ return response([
'type' => 1, 'type' => 1,
@ -215,7 +215,7 @@ class OrderController extends Controller
]); ]);
case 5: case 5:
if (!(int)config('v2board.mgate_enable')) { if (!(int)config('v2board.mgate_enable')) {
abort(500, '支付方式不可用'); abort(500, __('user.order.checkout.pay_method_not_use'));
} }
return response([ return response([
'type' => 1, 'type' => 1,
@ -223,7 +223,7 @@ class OrderController extends Controller
]); ]);
case 6: case 6:
if (!(int)config('v2board.stripe_card_enable')) { if (!(int)config('v2board.stripe_card_enable')) {
abort(500, '支付方式不可用'); abort(500, __('user.order.checkout.pay_method_not_use'));
} }
return response([ return response([
'type' => 2, 'type' => 2,
@ -231,14 +231,14 @@ class OrderController extends Controller
]); ]);
case 7: case 7:
if (!(int)config('v2board.epay_enable')) { if (!(int)config('v2board.epay_enable')) {
abort(500, '支付方式不可用'); abort(500, __('user.order.checkout.pay_method_not_use'));
} }
return response([ return response([
'type' => 1, 'type' => 1,
'data' => $this->epay($order) 'data' => $this->epay($order)
]); ]);
default: default:
abort(500, '支付方式不存在'); abort(500, __('user.order.checkout.pay_method_not_use'));
} }
} }
@ -249,7 +249,7 @@ class OrderController extends Controller
->where('user_id', $request->session()->get('id')) ->where('user_id', $request->session()->get('id'))
->first(); ->first();
if (!$order) { if (!$order) {
abort(500, '订单不存在'); abort(500, __('user.order.check.order_not_exist'));
} }
return response([ return response([
'data' => $order->status 'data' => $order->status
@ -323,20 +323,20 @@ class OrderController extends Controller
public function cancel(Request $request) public function cancel(Request $request)
{ {
if (empty($request->input('trade_no'))) { if (empty($request->input('trade_no'))) {
abort(500, '参数有误'); abort(500, __('user.order.cancel.params_wrong'));
} }
$order = Order::where('trade_no', $request->input('trade_no')) $order = Order::where('trade_no', $request->input('trade_no'))
->where('user_id', $request->session()->get('id')) ->where('user_id', $request->session()->get('id'))
->first(); ->first();
if (!$order) { if (!$order) {
abort(500, '订单不存在'); abort(500, __('user.order.cancel.order_not_exist'));
} }
if ($order->status !== 0) { if ($order->status !== 0) {
abort(500, '只可以取消待支付订单'); abort(500, __('user.order.cancel.only_cancel_pending_order'));
} }
$orderService = new OrderService($order); $orderService = new OrderService($order);
if (!$orderService->cancel()) { if (!$orderService->cancel()) {
abort(500, '取消失败'); abort(500, __('user.order.cancel.cancel_failed'));
} }
return response([ return response([
'data' => true 'data' => true
@ -372,7 +372,7 @@ class OrderController extends Controller
$currency = config('v2board.stripe_currency', 'hkd'); $currency = config('v2board.stripe_currency', 'hkd');
$exchange = Helper::exchange('CNY', strtoupper($currency)); $exchange = Helper::exchange('CNY', strtoupper($currency));
if (!$exchange) { if (!$exchange) {
abort(500, '货币转换超时,请稍后再试'); abort(500, __('user.order.stripeAlipay.currency_convert_timeout'));
} }
Stripe::setApiKey(config('v2board.stripe_sk_live')); Stripe::setApiKey(config('v2board.stripe_sk_live'));
$source = Source::create([ $source = Source::create([
@ -390,7 +390,7 @@ class OrderController extends Controller
] ]
]); ]);
if (!$source['redirect']['url']) { if (!$source['redirect']['url']) {
abort(500, '支付网关请求失败'); abort(500, __('user.order.stripeAlipay.gateway_request_failed'));
} }
return $source['redirect']['url']; return $source['redirect']['url'];
} }
@ -400,7 +400,7 @@ class OrderController extends Controller
$currency = config('v2board.stripe_currency', 'hkd'); $currency = config('v2board.stripe_currency', 'hkd');
$exchange = Helper::exchange('CNY', strtoupper($currency)); $exchange = Helper::exchange('CNY', strtoupper($currency));
if (!$exchange) { if (!$exchange) {
abort(500, '货币转换超时,请稍后再试'); abort(500, __('user.order.stripeWepay.currency_convert_timeout'));
} }
Stripe::setApiKey(config('v2board.stripe_sk_live')); Stripe::setApiKey(config('v2board.stripe_sk_live'));
$source = Source::create([ $source = Source::create([
@ -417,7 +417,7 @@ class OrderController extends Controller
] ]
]); ]);
if (!$source['wechat']['qr_code_url']) { if (!$source['wechat']['qr_code_url']) {
abort(500, '支付网关请求失败'); abort(500, __('user.order.stripeWepay.gateway_request_failed'));
} }
return $source['wechat']['qr_code_url']; return $source['wechat']['qr_code_url'];
} }
@ -427,7 +427,7 @@ class OrderController extends Controller
$currency = config('v2board.stripe_currency', 'hkd'); $currency = config('v2board.stripe_currency', 'hkd');
$exchange = Helper::exchange('CNY', strtoupper($currency)); $exchange = Helper::exchange('CNY', strtoupper($currency));
if (!$exchange) { if (!$exchange) {
abort(500, '货币转换超时,请稍后再试'); abort(500, __('user.order.stripeCard.currency_convert_timeout'));
} }
Stripe::setApiKey(config('v2board.stripe_sk_live')); Stripe::setApiKey(config('v2board.stripe_sk_live'));
try { try {
@ -442,11 +442,11 @@ class OrderController extends Controller
] ]
]); ]);
} catch (\Exception $e) { } catch (\Exception $e) {
abort(500, '遇到了点问题,请刷新页面稍后再试'); abort(500, __('user.order.stripeCard.was_problem'));
} }
info($charge); info($charge);
if (!$charge->paid) { if (!$charge->paid) {
abort(500, '扣款失败,请检查信用卡信息'); abort(500, __('user.order.stripeCard.deduction_failed'));
} }
return $charge->paid; return $charge->paid;
} }

View File

@ -14,7 +14,7 @@ class PlanController extends Controller
$plan = Plan::where('id', $request->input('id')) $plan = Plan::where('id', $request->input('id'))
->first(); ->first();
if (!$plan) { if (!$plan) {
abort(500, '该订阅不存在'); abort(500, __('user.plan.fetch.plan_not_exist'));
} }
return response([ return response([
'data' => $plan 'data' => $plan

View File

@ -23,7 +23,7 @@ class TicketController extends Controller
->where('user_id', $request->session()->get('id')) ->where('user_id', $request->session()->get('id'))
->first(); ->first();
if (!$ticket) { if (!$ticket) {
abort(500, '工单不存在'); abort(500, __('user.ticket.fetch.ticket_not_exist'));
} }
$ticket['message'] = TicketMessage::where('ticket_id', $ticket->id)->get(); $ticket['message'] = TicketMessage::where('ticket_id', $ticket->id)->get();
for ($i = 0; $i < count($ticket['message']); $i++) { for ($i = 0; $i < count($ticket['message']); $i++) {
@ -56,7 +56,7 @@ class TicketController extends Controller
{ {
DB::beginTransaction(); DB::beginTransaction();
if ((int)Ticket::where('status', 0)->where('user_id', $request->session()->get('id'))->count()) { if ((int)Ticket::where('status', 0)->where('user_id', $request->session()->get('id'))->count()) {
abort(500, '存在其他工单尚未处理'); abort(500, __('user.ticket.save.exist_other_open_ticket'));
} }
$ticket = Ticket::create(array_merge($request->only([ $ticket = Ticket::create(array_merge($request->only([
'subject', 'subject',
@ -67,7 +67,7 @@ class TicketController extends Controller
])); ]));
if (!$ticket) { if (!$ticket) {
DB::rollback(); DB::rollback();
abort(500, '工单创建失败'); abort(500, __('user.ticket.save.ticket_create_failed'));
} }
$ticketMessage = TicketMessage::create([ $ticketMessage = TicketMessage::create([
'user_id' => $request->session()->get('id'), 'user_id' => $request->session()->get('id'),
@ -76,7 +76,7 @@ class TicketController extends Controller
]); ]);
if (!$ticketMessage) { if (!$ticketMessage) {
DB::rollback(); DB::rollback();
abort(500, '工单创建失败'); abort(500, __('user.ticket.save.ticket_create_failed'));
} }
DB::commit(); DB::commit();
$this->sendNotify($ticket, $ticketMessage); $this->sendNotify($ticket, $ticketMessage);
@ -88,22 +88,22 @@ class TicketController extends Controller
public function reply(Request $request) public function reply(Request $request)
{ {
if (empty($request->input('id'))) { if (empty($request->input('id'))) {
abort(500, '参数错误'); abort(500, __('user.ticket.reply.params_wrong'));
} }
if (empty($request->input('message'))) { if (empty($request->input('message'))) {
abort(500, '消息不能为空'); abort(500, __('user.ticket.reply.message_not_empty'));
} }
$ticket = Ticket::where('id', $request->input('id')) $ticket = Ticket::where('id', $request->input('id'))
->where('user_id', $request->session()->get('id')) ->where('user_id', $request->session()->get('id'))
->first(); ->first();
if (!$ticket) { if (!$ticket) {
abort(500, '工单不存在'); abort(500, __('user.ticket.reply.ticket_not_exist'));
} }
if ($ticket->status) { if ($ticket->status) {
abort(500, '工单已关闭,无法回复'); abort(500, __('user.ticket.reply.ticket_close_not_reply'));
} }
if ($request->session()->get('id') == $this->getLastMessage($ticket->id)->user_id) { if ($request->session()->get('id') == $this->getLastMessage($ticket->id)->user_id) {
abort(500, '请等待技术支持回复'); abort(500, __('user.ticket.reply.wait_reply'));
} }
DB::beginTransaction(); DB::beginTransaction();
$ticketMessage = TicketMessage::create([ $ticketMessage = TicketMessage::create([
@ -114,7 +114,7 @@ class TicketController extends Controller
$ticket->last_reply_user_id = $request->session()->get('id'); $ticket->last_reply_user_id = $request->session()->get('id');
if (!$ticketMessage || !$ticket->save()) { if (!$ticketMessage || !$ticket->save()) {
DB::rollback(); DB::rollback();
abort(500, '工单回复失败'); abort(500, __('user.ticket.reply.ticket_reply_failed'));
} }
DB::commit(); DB::commit();
$this->sendNotify($ticket, $ticketMessage); $this->sendNotify($ticket, $ticketMessage);
@ -127,17 +127,17 @@ class TicketController extends Controller
public function close(Request $request) public function close(Request $request)
{ {
if (empty($request->input('id'))) { if (empty($request->input('id'))) {
abort(500, '参数错误'); abort(500, __('user.ticket.close.params_wrong'));
} }
$ticket = Ticket::where('id', $request->input('id')) $ticket = Ticket::where('id', $request->input('id'))
->where('user_id', $request->session()->get('id')) ->where('user_id', $request->session()->get('id'))
->first(); ->first();
if (!$ticket) { if (!$ticket) {
abort(500, '工单不存在'); abort(500, __('user.ticket.close.ticket_not_exist'));
} }
$ticket->status = 1; $ticket->status = 1;
if (!$ticket->save()) { if (!$ticket->save()) {
abort(500, '关闭失败'); abort(500, __('user.ticket.close.close_failed'));
} }
return response([ return response([
'data' => true 'data' => true
@ -160,15 +160,15 @@ class TicketController extends Controller
Dict::WITHDRAW_METHOD_WHITELIST_DEFAULT Dict::WITHDRAW_METHOD_WHITELIST_DEFAULT
) )
)) { )) {
abort(500, '不支持的提现方式'); abort(500, __('user.ticket.withdraw.not_support_withdraw_method'));
} }
$user = User::find($request->session()->get('id')); $user = User::find($request->session()->get('id'));
$limit = config('v2board.commission_withdraw_limit', 100); $limit = config('v2board.commission_withdraw_limit', 100);
if ($limit > ($user->commission_balance / 100)) { if ($limit > ($user->commission_balance / 100)) {
abort(500, "当前系统要求的提现门槛佣金需为{$limit}CNY"); abort(500, __('user.ticket.withdraw.system_require_withdraw_limit', ['limit' => $limit]));
} }
DB::beginTransaction(); DB::beginTransaction();
$subject = '[提现申请]本工单由系统发出'; $subject = __('user.ticket.withdraw.ticket_subject');
$ticket = Ticket::create([ $ticket = Ticket::create([
'subject' => $subject, 'subject' => $subject,
'level' => 2, 'level' => 2,
@ -177,9 +177,12 @@ class TicketController extends Controller
]); ]);
if (!$ticket) { if (!$ticket) {
DB::rollback(); DB::rollback();
abort(500, '工单创建失败'); abort(500, __('user.ticket.withdraw.ticket_create_failed'));
} }
$message = "提现方式:{$request->input('withdraw_method')}\r\n提现账号:{$request->input('withdraw_account')}\r\n"; $message = __('user.ticket.withdraw.ticket_message', [
'method' => $request->input('withdraw_method'),
'account' => $request->input('withdraw_account')
]);
$ticketMessage = TicketMessage::create([ $ticketMessage = TicketMessage::create([
'user_id' => $request->session()->get('id'), 'user_id' => $request->session()->get('id'),
'ticket_id' => $ticket->id, 'ticket_id' => $ticket->id,
@ -187,7 +190,7 @@ class TicketController extends Controller
]); ]);
if (!$ticketMessage) { if (!$ticketMessage) {
DB::rollback(); DB::rollback();
abort(500, '工单创建失败'); abort(500, __('user.ticket.withdraw.ticket_create_failed'));
} }
DB::commit(); DB::commit();
$this->sendNotify($ticket, $ticketMessage); $this->sendNotify($ticket, $ticketMessage);

View File

@ -28,19 +28,19 @@ class UserController extends Controller
{ {
$user = User::find($request->session()->get('id')); $user = User::find($request->session()->get('id'));
if (!$user) { if (!$user) {
abort(500, '该用户不存在'); abort(500, __('user.user.changePassword.user_not_exist'));
} }
if (!Helper::multiPasswordVerify( if (!Helper::multiPasswordVerify(
$user->password_algo, $user->password_algo,
$request->input('old_password'), $request->input('old_password'),
$user->password) $user->password)
) { ) {
abort(500, '旧密码有误'); abort(500, __('user.user.changePassword.old_password_wrong'));
} }
$user->password = password_hash($request->input('new_password'), PASSWORD_DEFAULT); $user->password = password_hash($request->input('new_password'), PASSWORD_DEFAULT);
$user->password_algo = NULL; $user->password_algo = NULL;
if (!$user->save()) { if (!$user->save()) {
abort(500, '保存失败'); abort(500, __('user.user.changePassword.save_failed'));
} }
$request->session()->flush(); $request->session()->flush();
return response([ return response([
@ -69,7 +69,7 @@ class UserController extends Controller
]) ])
->first(); ->first();
if (!$user) { if (!$user) {
abort(500, '该用户不存在'); abort(500, __('user.user.info.user_not_exist'));
} }
$user['avatar_url'] = 'https://cdn.v2ex.com/gravatar/' . md5($user->email) . '?s=64&d=identicon'; $user['avatar_url'] = 'https://cdn.v2ex.com/gravatar/' . md5($user->email) . '?s=64&d=identicon';
return response([ return response([
@ -109,12 +109,12 @@ class UserController extends Controller
]) ])
->first(); ->first();
if (!$user) { if (!$user) {
abort(500, '该用户不存在'); abort(500, __('user.user.getSubscribe.user_not_exist'));
} }
if ($user->plan_id) { if ($user->plan_id) {
$user['plan'] = Plan::find($user->plan_id); $user['plan'] = Plan::find($user->plan_id);
if (!$user['plan']) { if (!$user['plan']) {
abort(500, '订阅计划不存在'); abort(500, __('user.user.getSubscribe.plan_not_exist'));
} }
} }
$user['subscribe_url'] = config('v2board.subscribe_url', config('v2board.app_url', env('APP_URL'))) . '/api/v1/client/subscribe?token=' . $user['token']; $user['subscribe_url'] = config('v2board.subscribe_url', config('v2board.app_url', env('APP_URL'))) . '/api/v1/client/subscribe?token=' . $user['token'];
@ -128,12 +128,12 @@ class UserController extends Controller
{ {
$user = User::find($request->session()->get('id')); $user = User::find($request->session()->get('id'));
if (!$user) { if (!$user) {
abort(500, '该用户不存在'); abort(500, __('user.user.resetSecurity.user_not_exist'));
} }
$user->uuid = Helper::guid(true); $user->uuid = Helper::guid(true);
$user->token = Helper::guid(); $user->token = Helper::guid();
if (!$user->save()) { if (!$user->save()) {
abort(500, '重置失败'); abort(500, __('user.user.resetSecurity.reset_failed'));
} }
return response([ return response([
'data' => config('v2board.subscribe_url', config('v2board.app_url', env('APP_URL'))) . '/api/v1/client/subscribe?token=' . $user->token 'data' => config('v2board.subscribe_url', config('v2board.app_url', env('APP_URL'))) . '/api/v1/client/subscribe?token=' . $user->token
@ -149,12 +149,12 @@ class UserController extends Controller
$user = User::find($request->session()->get('id')); $user = User::find($request->session()->get('id'));
if (!$user) { if (!$user) {
abort(500, '该用户不存在'); abort(500, __('user.user.update.user_not_exist'));
} }
try { try {
$user->update($updateData); $user->update($updateData);
} catch (\Exception $e) { } catch (\Exception $e) {
abort(500, '保存失败'); abort(500, __('user.user.update.save_failed'));
} }
return response([ return response([
@ -166,18 +166,18 @@ class UserController extends Controller
{ {
$user = User::find($request->session()->get('id')); $user = User::find($request->session()->get('id'));
if (!$user) { if (!$user) {
abort(500, '该用户不存在'); abort(500, __('user.user.transfer.user_not_exist'));
} }
if ($request->input('transfer_amount') <= 0) { if ($request->input('transfer_amount') <= 0) {
abort(500, '参数错误'); abort(500, __('user.user.transfer.params_wrong'));
} }
if ($request->input('transfer_amount') > $user->commission_balance) { if ($request->input('transfer_amount') > $user->commission_balance) {
abort(500, '推广佣金余额不足'); abort(500, __('user.user.transfer.insufficient_commission_balance'));
} }
$user->commission_balance = $user->commission_balance - $request->input('transfer_amount'); $user->commission_balance = $user->commission_balance - $request->input('transfer_amount');
$user->balance = $user->balance + $request->input('transfer_amount'); $user->balance = $user->balance + $request->input('transfer_amount');
if (!$user->save()) { if (!$user->save()) {
abort(500, '划转失败'); abort(500, __('user.user.transfer.transfer_failed'));
} }
return response([ return response([
'data' => true 'data' => true

View File

@ -43,6 +43,7 @@ class Kernel extends HttpKernel
\Illuminate\Session\Middleware\StartSession::class, \Illuminate\Session\Middleware\StartSession::class,
\App\Http\Middleware\ForceJson::class, \App\Http\Middleware\ForceJson::class,
\App\Http\Middleware\CORS::class, \App\Http\Middleware\CORS::class,
\App\Http\Middleware\Language::class,
'bindings', 'bindings',
], ],
]; ];

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\App;
class Language
{
public function handle($request, Closure $next)
{
if ($request->header('content-language')) {
App::setLocale($request->header('content-language'));
}
return $next($request);
}
}

View File

@ -22,6 +22,12 @@ class User
$request->session()->put('id', $user->id); $request->session()->put('id', $user->id);
} }
} }
// if ($request->input('lang')) {
// $request->session()->put('lang', $request->input('lang'));
// }
// if ($request->session()->get('lang')) {
// App::setLocale($request->session()->get('lang'));
// }
if (!$request->session()->get('id')) { if (!$request->session()->get('id')) {
abort(403, '未登录或登陆已过期'); abort(403, '未登录或登陆已过期');
} }

View File

@ -80,7 +80,7 @@ return [
| |
*/ */
'locale' => 'en', 'locale' => 'zh-CN',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -93,7 +93,7 @@ return [
| |
*/ */
'fallback_locale' => 'en', 'fallback_locale' => 'zh-CN',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -106,7 +106,7 @@ return [
| |
*/ */
'faker_locale' => 'en_US', 'faker_locale' => 'zh-CN',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,19 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used during authentication for various
| messages that we need to display to the user. You are free to modify
| these language lines according to your application's requirements.
|
*/
'failed' => 'These credentials do not match our records.',
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
];

View File

@ -1,19 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Previous',
'next' => 'Next &raquo;',
];

View File

@ -1,21 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => 'Your password has been reset!',
'sent' => 'We have e-mailed your password reset link!',
'token' => 'This password reset token is invalid.',
'user' => "We can't find a user with that e-mail address.",
];

View File

@ -1,150 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'The :attribute must be accepted.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
'alpha' => 'The :attribute may only contain letters.',
'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.',
'alpha_num' => 'The :attribute may only contain letters and numbers.',
'array' => 'The :attribute must be an array.',
'before' => 'The :attribute must be a date before :date.',
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
'between' => [
'numeric' => 'The :attribute must be between :min and :max.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute confirmation does not match.',
'date' => 'The :attribute is not a valid date.',
'date_equals' => 'The :attribute must be a date equal to :date.',
'date_format' => 'The :attribute does not match the format :format.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => 'The :attribute must be a valid email address.',
'ends_with' => 'The :attribute must end with one of the following: :values',
'exists' => 'The selected :attribute is invalid.',
'file' => 'The :attribute must be a file.',
'filled' => 'The :attribute field must have a value.',
'gt' => [
'numeric' => 'The :attribute must be greater than :value.',
'file' => 'The :attribute must be greater than :value kilobytes.',
'string' => 'The :attribute must be greater than :value characters.',
'array' => 'The :attribute must have more than :value items.',
],
'gte' => [
'numeric' => 'The :attribute must be greater than or equal :value.',
'file' => 'The :attribute must be greater than or equal :value kilobytes.',
'string' => 'The :attribute must be greater than or equal :value characters.',
'array' => 'The :attribute must have :value items or more.',
],
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field does not exist in :other.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'ipv4' => 'The :attribute must be a valid IPv4 address.',
'ipv6' => 'The :attribute must be a valid IPv6 address.',
'json' => 'The :attribute must be a valid JSON string.',
'lt' => [
'numeric' => 'The :attribute must be less than :value.',
'file' => 'The :attribute must be less than :value kilobytes.',
'string' => 'The :attribute must be less than :value characters.',
'array' => 'The :attribute must have less than :value items.',
],
'lte' => [
'numeric' => 'The :attribute must be less than or equal :value.',
'file' => 'The :attribute must be less than or equal :value kilobytes.',
'string' => 'The :attribute must be less than or equal :value characters.',
'array' => 'The :attribute must not have more than :value items.',
],
'max' => [
'numeric' => 'The :attribute may not be greater than :max.',
'file' => 'The :attribute may not be greater than :max kilobytes.',
'string' => 'The :attribute may not be greater than :max characters.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => 'The :attribute must be a file of type: :values.',
'mimetypes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'The selected :attribute is invalid.',
'not_regex' => 'The :attribute format is invalid.',
'numeric' => 'The :attribute must be a number.',
'present' => 'The :attribute field must be present.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values are present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute and :other must match.',
'size' => [
'numeric' => 'The :attribute must be :size.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
],
'starts_with' => 'The :attribute must start with one of the following: :values',
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid zone.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'url' => 'The :attribute format is invalid.',
'uuid' => 'The :attribute must be a valid UUID.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [],
];

View File

@ -0,0 +1,37 @@
<?php
return [
'auth' => [
'register' => [
'verify_incorrect' => '验证码有误',
'email_suffix_not_in_whitelist' => '邮箱后缀不处于白名单中',
'no_support_gmail_alias' => '不支持Gmail别名邮箱',
'close_register' => '本站已关闭注册',
'must_use_invite_code' => '必须使用邀请码才可以注册',
'email_code_not_empty' => '邮箱验证码不能为空',
'email_code_incorrect' => '邮箱验证码有误',
'email_exist_system' => '邮箱已存在系统中',
'invalid_invite_code' => '邀请码无效',
'register_failed' => '注册失败'
],
'login' => [
'wrong_email_or_password' => '邮箱或密码错误',
'account_been_discontinued' => '该账户已被停止使用'
],
'getQuickLoginUrl' => [
'wrong_token' => '令牌有误'
],
'forget' => [
'email_verification_code_incorrect' => '邮箱验证码有误',
'email_not_exist_system' => '该邮箱不存在系统中',
'reset_failed' => '重置失败'
]
],
'comm' => [
'sendEmailVerify' => [
'verification_code_incorrect.' => '验证码有误',
'code_sent_request_later' => '验证码已发送,请过一会再请求',
'email_verification_code' => '邮箱验证码'
]
]
];

View File

@ -0,0 +1,131 @@
<?php
return [
'user' => [
'changePassword' => [
'user_not_exist' => '该用户不存在',
'old_password_wrong' => '旧密码有误',
'save_failed' => '保存失败'
],
'info' => [
'user_not_exist' => '该用户不存在'
],
'getSubscribe' => [
'user_not_exist' => '该用户不存在',
'plan_not_exist' => '订阅计划不存在',
],
'resetSecurity' => [
'user_not_exist' => '该用户不存在',
'reset_failed' => '重置失败'
],
'update' => [
'user_not_exist' => '该用户不存在',
'save_failed' => '保存失败',
],
'transfer' => [
'user_not_exist' => '该用户不存在',
'params_wrong' => '参数错误',
'insufficient_commission_balance' => '推广佣金余额不足',
'transfer_failed' => '划转失败'
]
],
'ticket' => [
'fetch' => [
'ticket_not_exist' => '工单不存在',
],
'save' => [
'exist_other_open_ticket' => '存在其他工单尚未处理',
'ticket_create_failed' => '工单创建失败',
],
'reply' => [
'params_wrong' => '参数错误',
'message_not_empty' => '消息不能为空',
'ticket_not_exist' => '工单不存在',
'ticket_close_not_reply' => '工单已关闭,无法回复',
'wait_reply' => '请等待技术支持回复',
'ticket_reply_failed' => '工单回复失败',
],
'close' => [
'params_wrong' => '参数错误',
'ticket_not_exist' => '工单不存在',
'close_failed' => '关闭失败',
],
'withdraw' => [
'not_support_withdraw_method' => '不支持的提现方式',
'system_require_withdraw_limit' => '当前系统要求的提现门槛佣金需为:limitCNY',
'ticket_subject' => '[提现申请]本工单由系统发出',
'ticket_create_failed' => '工单创建失败',
'ticket_message' => "提现方式::method\r\n提现账号::account\r\n"
]
],
'plan' => [
'fetch' => [
'plan_not_exist' => '订阅计划不存在'
]
],
'order' => [
'details' => [
'order_not_exist' => '订单不存在',
'plan_not_exist' => '订阅计划不存在',
],
'save' => [
'plan_not_exist' => '订阅计划不存在',
'exist_open_order' => '您有未付款或开通中的订单,请稍后或取消再试',
'plan_stop_sell' => '该订阅已售罄,请更换其他订阅',
'plan_stop_renew' => '该订阅无法续费,请更换其他订阅',
'plan_stop' => '该订阅周期无法进行购买,请选择其他周期',
'plan_exist_not_buy_package' => '订阅已过期或无有效订阅,无法购买重置包',
'plan_expired' => '订阅已过期,请更换其他订阅',
'coupon_use_failed' => '优惠券使用失败',
'insufficient_balance' => '余额不足',
'order_create_failed' => '订单创建失败'
],
'checkout' => [
'order_not_exist_or_paid' => '订单不存在或已支付',
'pay_method_not_use' => '支付方式不可用',
],
'check' => [
'order_not_exist' => '订单不存在'
],
'cancel' => [
'params_wrong' => '参数有误',
'order_not_exist' => '订单不存在',
'only_cancel_pending_order' => '只可以取消待支付订单',
'cancel_failed' => '取消失败',
],
'stripeAlipay' => [
'currency_convert_timeout' => '货币转换超时,请稍后再试',
'gateway_request_failed' => '支付网关请求失败',
],
'stripeWepay' => [
'currency_convert_timeout' => '货币转换超时,请稍后再试',
'gateway_request_failed' => '支付网关请求失败',
],
'stripeCard' => [
'currency_convert_timeout' => '货币转换超时,请稍后再试',
'was_problem' => '遇到了点问题,请刷新页面稍后再试',
'deduction_failed' => '扣款失败,请检查信用卡信息'
]
],
'knowledge' => [
'fetch' => [
'knowledge_not_exist' => '知识不存在',
'apple_id_must_be_plan' => '没有有效订阅无法使用本站提供的AppleID'
]
],
'invite' => [
'save' => [
'invite_create_limit' => '已达到创建数量上限'
]
],
'coupon' => [
'check' => [
'coupon_not_empty' => '优惠券码不能为空',
'coupon_invalid' => '优惠券无效',
'coupon_not_available_by_number' => '优惠券已无可用次数',
'coupon_not_available_by_time' => '优惠券还未到可用时间',
'coupon_expired' => '优惠券已过期',
'coupon_limit_plan' => '这个计划无法使用该优惠码'
]
]
];